GLSL + OpenGL远离状态机

时间:2011-04-11 16:00:48

标签: opengl glsl

嘿伙计们,我开始将我的一个项目从固定管道中移开,所以为了尝试一下,我试着编写一个着色器,只需通过OpenGL矩阵并用它转换顶点,然后开始计算我自己的知道这很有效。我认为这将是一项简单的任务,但即使这样也行不通。

我开始使用此着色器进行正常的固定管道:

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%肯定那些矩阵在我通过之前是正确的顺便说一句)任何想法?

3 个答案:

答案 0 :(得分:2)

对于矩阵数学,请尝试使用外部库,例如GLM。它们还有一些关于如何创建必要矩阵的基本examples并进行投影*视图*模型转换。

答案 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上运行。