我是HLSL的初学者,并且有一些示例代码呈现平面三角形。如果我尝试将PShader函数从返回显式颜色的函数替换为引用下面的全局变量(mycol)的函数,那么它不再呈现三角形而是黑色。
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 :(得分:0)
如果使用单独的着色器,则全局变量可能已更改值...尝试向前传递变量:
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;
}
答案 1 :(得分: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);
并在着色器中:
cbuffer colorbuf : register(b0)
{
float4 mycol;
};