2013-01-19 495 views
0

我是HLSL的初学者,并有一些呈现平面三角形的示例代码。如果我试图将PShader函数替换为将显式颜色返回为引用下面全局变量(mycol)的函数,那么它不再呈现三角形的颜色,而是呈现黑色。简单的HLSL文件不起作用?

float4 mycol = float4(1.0f, 1.0f, 0.0f, 1.0f); 

float4 VShader(float4 position : POSITION) : SV_POSITION 
{ 
     return position; 
} 

float4 PShader(float4 position : SV_POSITION) : SV_Target 
{ 
    return mycol; // float4(1.0f, 0.0f, 1.0f, 1.0f); 
} 

我试过阅读HLSL规范,但觉得我可能错过了明显的东西?

任何帮助表示赞赏, GMAN

回答

0

我相信你可以只在directx中使用常量缓冲区传递全局值。你需要开始不断缓冲的C++代码:

D3D11_BUFFER_DESC constDesc; 
ZeroMemory(&constDesc, sizeof(constDesc)); 
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
constDesc.ByteWidth = sizeof(XMFLOAT4); 
constDesc.Usage = D3D11_USAGE_DEFAULT; 

d3dResult = d3dDevice_->CreateBuffer(&constDesc, 0, &shaderCB_); 

if(FAILED(d3dResult)) 
{ 
    return false; 
} 

然后在您的渲染代码:

XMFLOAT4 mycol = XMFLOAT4(1,1,0,1); 
d3dContext_->UpdateSubresource(shaderCB_, 0, 0, &mycol, 0, 0); 

,并在你的shader:

cbuffer colorbuf : register(b0) 
{ 
    float4 mycol; 
}; 
0

这可能是因为你的全局变量发生变化的值,如果你是使用分离着色器...尝试passaing向前变量:

float4 mycol = float4(1.0f, 1.0f, 0.0f, 1.0f); 

struct VS_OUT 
{ 
    float4 pos : SV_Position; 
    float4 color : COLOR0; 
} 

VS_OUT VShader(float4 position : POSITION) 
{ 
    VS_OUT ret; 
    ret.pos = position; 
    ret.color = mycol; // forward variable 
    return ret; 
} 

float4 PShader(VS_OUT input) : SV_Target 
{ 
    return input.color; 
}