2014-06-18 3 views
1

저는 DirectX11에서 초보자입니다. 그래서 무딘 질문에 사과드립니다.균일 한 색을 픽셀 쉐이더로 설정

struct PixelShaderInput 
{ 
    float4 pos : SV_POSITION; 
    float2 texCoord : TEXCOORD0; 
}; 

Texture2D s_texture : register(t0); 

SamplerState s_sampleParams 
{ 
    Filter = MIN_MAG_MIP_LINEAR; 
    AddressU = CLAMP; 
    AddressV = CLAMP; 
}; 

float4 main(PixelShaderInput input) : SV_TARGET 
{ 
    float4 t = s_texture.Sample(s_sampleParams, input.texCoord); 
    return t; 
} 

지금 내 쉐이더에 색상을 추가 할 :

struct PixelShaderInput 
{ 
    float4 pos : SV_POSITION; 
    float2 texCoord : TEXCOORD0; 
}; 

Texture2D s_texture : register(t0); 
float4 s_color; 

SamplerState s_sampleParams 
{ 
    Filter = MIN_MAG_MIP_LINEAR; 
    AddressU = CLAMP; 
    AddressV = CLAMP; 
}; 

float4 main(PixelShaderInput input) : SV_TARGET 
{ 
    float4 t = s_texture.Sample(s_sampleParams, input.texCoord); 
    return t * s_color; 
} 

나는 C++ 코드에서 s_color을 설정하려면 어떻게 나는 픽셀 쉐이더가? m_d3dContext->PSSetConstantBuffers을 사용해야합니까? 이 경우에는 내가 바로,

`float4 s_color;` 

cbuffer ColorOnlyConstantBuffer : register(b0) 
{ 
    float4 m_color; 
}; 

에 변경해야합니까?

아니면 간단하게 정의 float4 s_color;을 유지하고 C++에서 설정해도됩니까?

+0

실제로 이동하는 방법, http://msdn.microsoft.com/en-us/library/windows/desktop/ff476896(v=vs.85입니다) .aspx는 그것을 설정하는 방법을 설명합니다 (물론 당신이 말한 것처럼 픽셀 셰이더에 바인딩되어야합니다). – catflier

답변

0

지금까지 내가, 당신이 특정 구조를 사용하여 버텍스 쉐이더를위한 입력 항목을 지정 기억으로 :

D3D11_INPUT_ELEMENT_DESC inputLayoutDesc[2] = 
{ 
    { "Position", 
     0, 
     DXGI_FORMAT_R32G32B32_FLOAT, 
     0, 
     D3D11_APPEND_ALIGNED_ELEMENT, 
     D3D11_INPUT_PER_VERTEX_DATA, 
     0 
    }, 
    { "Color", 
     0, 
     DXGI_FORMAT_R32G32B32_FLOAT, 
     0, 
     D3D11_APPEND_ALIGNED_ELEMENT, 
     D3D11_INPUT_PER_VERTEX_DATA, 
     0 
    } 
}; 

이 구조는 ID3D11InputLayout를 생성하는 데 사용되는 :

const UINT inputLayoutDescCount = 2; 

hr = device->CreateInputLayout(
    inputLayoutDesc, 
    inputLayoutDescCount, 
    compiledVsShader->GetBufferPointer(), 
    compiledVsShader->GetBufferSize(), 
    &inputLayout); 

그런 의미를 사용할 수 있습니다 지정하려면 어떤 요소가 어떤 항목을 나타내는 지 :

struct VS_INPUT 
{ 
    float4 Pos : POSITION; 
    float4 Col : COLOR; 
}; 

편집 : 댓글에 대한 응답입니다.

죄송합니다. 상수 버퍼가 필요합니다. 코드의 관련 (샘플) 부분은 다음과 같습니다. 그냥 그들을 필요에 수정 : 일정한 버퍼를 사용

struct PixelConstantBuffer 
{ 
    XMFLOAT4 lightPos; 
    XMFLOAT4 observerPos; 
}; 

// *** 

D3D11_BUFFER_DESC pixelConstantBufferDesc; 
pixelConstantBufferDesc.ByteWidth = sizeof(PixelConstantBuffer); 
pixelConstantBufferDesc.Usage = D3D11_USAGE_DEFAULT; 
pixelConstantBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
pixelConstantBufferDesc.CPUAccessFlags = 0; 
pixelConstantBufferDesc.MiscFlags = 0; 
pixelConstantBufferDesc.StructureByteStride = 0; 

hr = device->CreateBuffer(&pixelConstantBufferDesc, nullptr, &pixelConstantBuffer); 

// *** 

context->PSSetConstantBuffers(1, 1, &pixelConstantBuffer); 
context->PSSetShader(pixelShader, nullptr, 0); 

// *** 

PixelConstantBuffer pcBuffer; 
pcBuffer.lightPos = XMFLOAT4(lightPos.m128_f32[0], lightPos.m128_f32[1], lightPos.m128_f32[2], lightPos.m128_f32[3]); 
pcBuffer.observerPos = XMFLOAT4(camPos.m128_f32[0], camPos.m128_f32[1], camPos.m128_f32[2], camPos.m128_f32[3]); 

context->UpdateSubresource(pixelConstantBuffer, 0, nullptr, &pcBuffer, 0, 0); 

// *** (hlsl) 

cbuffer PixelConstantBuffer : register(b1) 
{ 
    float4 LightPos; 
    float4 ObserverPos; 
} 
+0

's_color'를 전역 변수 (또는 uniform) 변수로 설정하려고합니다. 가변 당 변수가 아닙니다. – Nick