我开始使用此着色器进行正常的固定管道:
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
然后我将其更改为:
uniform mat4 model_matrix;
uniform mat4 projection_matrix;
void main(void)
{
gl_Position = model_matrix * projection_matrix * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
然后我检索这样的OpenGL矩阵,并使用以下代码将它们传递给着色器:
[material.shader bindShader];
GLfloat modelmat[16];
GLfloat projectionmat[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelmat);
glGetFloatv(GL_PROJECTION_MATRIX, projectionmat);
glUniformMatrix4fv([material.shader getUniformLocation:"model_matrix"], 1, GL_FALSE, modelmat);
glUniformMatrix4fv([material.shader getUniformLocation:"projection_matrix"], 1, GL_FALSE, projectionmat );
... Draw Stuff
出于某种原因,这并没有得出任何东西(我95%肯定那些矩阵在我通过之前是正确的顺便说一句)任何想法?
答案 0 :(得分:2)
答案 1 :(得分:2)
问题在于我的矩阵乘法顺序是错误的。我不知道这些操作不是可交换的。
正确的顺序应该是:
projection * modelview * vertex
感谢ltjax和doug65536
答案 2 :(得分:0)
使用OpenGL 3.3的着色语言。 OpenGL 3.3与硬件方面的DirectX10大致相当。
请勿使用已弃用的功能。您的第一个void main
示例中的几乎所有内容都已弃用。如果您希望使用驱动程序的高性能代码路径,则必须明确声明输入和输出。不推荐使用的功能也更有可能充满驱动程序错误。
使用更新,更明确的方式声明输入和输出,并在代码中设置它们。这真的不错。我认为这会很难看但实际上很容易(我希望我早些时候做过)。
仅供参考,我最后一次看到OpenGL(2012)的最低标准,就是OpenGL 3.3。几乎所有具有任何游戏功能的AMD和NVidia显卡都将拥有OpenGL 3.3。他们有一段时间了,所以你现在为OpenGL 3.3编写的任何代码都可以在典型的低端或更好的GPU上运行。