在不同的着色器中使用相同的常数缓冲液
Use the same constant buffer in distinct shaders
我有两个不同的着色器(PS和VS作为单独的文件),在它们中,我需要使用完全相同的常数缓冲区。他们是共享此常数缓冲区还是要加倍的代码?
我不使用效果,因此,如果我想在构建时间而不是运行时编译着着色器,则必须在不同的文件中分别编译PS和VS着色器(因此对我而言并非如此)。p>这是我现在的方法,显然给我带来了错误的错误:
vertexshader:
cbuffer cbPerObject : register(b0)
{
float4x4 gWorld;
float4x4 gWorldInvTranspose;
float4x4 gWorldViewProj;
Material gMaterial;
};
PixelShader:
cbuffer cbPerObject : register(b0)
{
float4x4 gWorld;
float4x4 gWorldInvTranspose;
float4x4 gWorldViewProj;
Material gMaterial;
};
cbuffer cbPerFrame : register(b1)
{
DirectionalLight gDirLight;
PointLight gPointLight;
SpotLight gSpotLight;
float3 gEyePosW;
};
我在render()方法中设置常量缓冲区的方式(我现在有一个对象,因此以相同的方式设置了PeroBJ和Persprame Buffer):
m_d3dContext->VSSetConstantBuffers(0, 1, m_cBuffer_perObject.GetAddressOf());
m_d3dContext->PSSetConstantBuffers(0, 1, m_cBuffer_perObject.GetAddressOf());
m_d3dContext->PSSetConstantBuffers(1, 1, m_cBuffer_perFrame.GetAddressOf());
那么什么不起作用?我有一个简单的立方网格。我成功地为Vertexpos VertexColour输入布局渲染了立方体,这一次我尝试添加一些照明公式,因此我使用vertexpos pertexnormal
amde新输入布局 { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }
因此,我的渲染极为巨大(尺度不是问题,所以我再次使用相同的比例尺和相机,用于颜色混合和照明配方,从书本和照明配方中,不会导致错误)。
使它起作用:我只是忘记考虑在HLSL和C 之间打包差异。如果有人对解决方案感兴趣,我必须将此单个预处理器命令添加到我的HLSL代码:
#pragma pack_matrix(row_major)
(或将转置矩阵发送到常数缓冲区)
相关文章:
- 如何使用原子指针执行双缓冲
- 消费者和生产者问题的双重缓冲
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 为什么 g++ 使用 movabs 和一个奇怪的常数来简单还原?
- 我似乎无法修改帧缓冲
- 如何在C++中写入 1000 个文件时有效地缓冲
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- 我是否使用双缓冲?
- OpenGL:使用实例化绘图与我正在绘制的帧缓冲进行绘制
- 为什么在C++负数static_cast如果<unsigned>数字是常数,则不同
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 如何强制文件描述符缓冲我的输出
- 变量和常数的C++划分不起作用
- Qt双缓冲行为
- 如何在没有缓冲的情况下使用 parquet-cpp 写入面向流/行的数据?
- 我应该将乘数声明为常数还是直接使用它而不声明?
- MySQL 事务和缓冲的请求列表
- 按常数偏移折线
- 如何在 C 和 C++ 中定义字符常数?
- 在不同的着色器中使用相同的常数缓冲液