2014-12-03 13 views
0

저는 어떻게하면 가장 간단한 (가장 빠른) GPU 기반 높이 맵을 구현하려고합니다. 셰이더에 (.png, D3DX11CreateShaderResourceViewFromFile()) 텍스처를 전달하고 현재 픽셀 값을 샘플링하려고 시도하고 있습니다. float4을보고 있는데, 현재 y 값을 상쇄하기 위해 채널의 색상 값을 할당하고 있습니다.Directx : HLSL 텍스처 기반 높이 맵. (Shader 5.0)

Texture2D colorMap : register(t0); 
SamplerState colorSampler : register(s0); 

... 

VOut VShader(float4 position : POSITION, float2 Texture : TEXCOORD0, float3 Normal : NORMAL) 
{ 
    VOut output; 

    float4 colors = colorMap.SampleLevel(colorSampler, float4(position.x*0.001, position.z*0.001, 0,0),0); 
    position.y = colors.x*128; 

    output.position = mul(position, WVP); 
    output.texture0 = Texture; 
    output.normal = Normal; 

    return output; 
} 

는 텍스처가 제대로 가져, 나는 다른 질감을 삽입하고 성공적으로 (값의 곱셈을 통해) 다른 질감과 텍스처를 혼합 할 수 있었다, 그래서 나는 float4 구조체는 종류의 값을 가지는 것을 알 수 산술 연산을 수행 할 수 있습니다. 당신은 Texture2D, 위치를 사용하고 있기 때문에

답변

1

... 개념은 종이에 충분한 간단한 듯 enter image description here

: 값을 추출하려고 시도 정점 기능에서

는 그리드에 아무 것도 얻을 수 없다 매개 변수는 float2 여야합니다.

또한 위치가 (0,0)에서 (1,1)로 이동해야합니다. 매핑이 정확하려면 그리드를 (0,0,0)에서 (1000,0,1000)까지 배치해야합니다. 이 경우

다음이 작동합니다 :

SampleLevel(colorSampler, position.xz*0.001 ,0); 

편집

나는 당신이 이것을 테스트하는 방법에 대한 궁금합니다. VOut 및 WVP에 대한 정의가 추가되어 코드 컴파일을 시도했지만 실패합니다. 오류 중 하나는 위치 매개 변수로 float4이며 float2 여야합니다. 다른 오류는 함수의 이름입니다. 그것은 main이어야합니다.

Visual Studio를 사용하는 경우 그래픽 디버깅 도구를 사용하고 모든 변수를 확인하는 것이 좋습니다. colorMap 텍스처가 픽셀 쉐이더에는 바인딩되지만 버텍스 쉐이더에는 바인딩되지 않을 수도 있습니다.

+0

확인하려면 텍스처 매개 변수를 위치 매개 변수로 전달해야합니까? 또는 from vertex? (x, y)의 위치. 둘 다 시도하고 값이 null 인 것 같습니다. –

+0

이 매개 변수는 텍스처 좌표를 나타내지 만 수정 된 위치와 같이 원하는 float2를 사용할 수 있습니다. 어떻게 테스트했는지 궁금합니다. VOut 및 WVP에 대한 정의가 추가되어 코드 컴파일을 시도했지만 실패합니다. 오류 중 하나는 위치 매개 변수로 float4이며 float2 여야합니다. 다른 오류는 함수의 이름입니다. 그것은 main이어야합니다. –

+0

Vertex 함수 이름은 무엇이든 될 수 있습니다. 적어도 VS hlsl 컴파일러에서. 'SampleLevel()'은'float4'를 리턴해야합니까? –