我有为WebGL编写的顶点和片段着色器,它们工作得很好。我试图让他们在使用OpenGL 2.1的C++程序中工作。(为什么是2.1?因为这是一个老项目,我正在逐步尝试更新它。在Mac上,我认为这就是兼容模式下可用的内容。)
到目前为止,顶点着色器似乎正在工作,但如果我启用照明,三角形将显示为黑色,当它们应该是多色的。如果我关闭照明,它们会正确显示,所以片段着色器正在做一些事情,只是不适合照明。这让我怀疑法线没有被正确处理。
有没有一种方法可以查询OpenGL 2.1来查看它为每个顶点上的特定属性向着色器发送了什么值?我可以使用glGetVertexAttribfv()
来查找属性的各种特征,但我担心我没有像OpenGL那样解释它们。
1条答案
按热度按时间6ss1mwsb1#
来自@BDL和@Yun的评论回答了我的问题。在OpenGL 2.1中没有一种简单的方法可以查看传递给着色器的值,但是修改着色器以将法线指定给输出颜色可以清楚地表明法线被错误地发送。(他们还建议使用调试器Nsight和RenderDoc,但我还不需要尝试这些。
原来程序是调用
glBufferData()
将数据发送到缓冲区,然后在客户端添加正常数据。这意味着着色器被告知从缓冲区的末尾获取法线,并且所有内容都为零。我有点惊讶这没有触发OpenGL错误,但它很容易修复。