嗨,我开始将我的一个项目从固定管道移开,所以尝试一下,我尝试着写一个着色器,它只是简单地传递OpenGL矩阵并将顶点转换为然后开始计算我自己,一旦我知道工作。我认为这将是一个简单的任务,但即使这样也行不通。GLSL + OpenGL离开状态机
我开始了这个shader正常固定管道:
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的矩阵是这样,并将它们传递到shader与此代码:
[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%积极的这些矩阵是正确的,然后我通过他们顺便说一句)任何想法?
为什么你检索OpenGL的矩阵,然后将它们传递回吗?是的,OpenGL-3核心降低了基础数学函数的功能,但不是为了让你实现一些环回。你应该自己做数学或者使用专门的矩阵数学库。 – datenwolf 2011-04-11 17:00:50
OpenGL状态机与固定功能管道无关。此外,使用可编程着色器代替固定功能OpenGL仍然是一个状态机(在这种情况下,绑定着色器,纹理和缓冲区定义GL状态)。 – datenwolf 2011-04-11 17:01:49
矩阵顺序在第二个版本中是错误的。应该是'projection * modelview * vertex'。 – ltjax 2011-04-11 17:05:28