GLSL&x2B;OpenGL正在远离状态机

GLSL&x2B;OpenGL正在远离状态机,opengl,glsl,Opengl,Glsl,我开始将我的一个项目从固定管道中移开,所以为了进行尝试,我尝试编写一个着色器,该着色器只需传递OpenGL矩阵,并用它变换顶点,然后在我知道它有效后开始计算我自己的顶点。我原以为这是一项简单的任务,但即使这样也行不通 我从这个着色器开始,用于普通固定管道: void main(void) { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_TexCoord[0] = gl_MultiTexCoord0; }

我开始将我的一个项目从固定管道中移开,所以为了进行尝试,我尝试编写一个着色器,该着色器只需传递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%肯定这些矩阵在我通过之前是正确的),有什么想法吗?

对于矩阵数学,请尝试使用外部库,例如。他们也有一些关于如何创建必要矩阵和进行投影*视图*模型变换的基础知识

使用OpenGL 3.3的着色语言。OpenGL 3.3在硬件方面与DirectX10大致相当

不要使用不推荐使用的功能。第一个
void main
示例中的几乎所有内容都不推荐使用。如果希望使用驱动程序的高性能代码路径,则必须明确声明输入和输出。不推荐使用的功能也更有可能充满驱动程序错误

使用更新、更显式的输入和输出声明样式,并在代码中设置它们。这真的不坏。我原以为这会很难看,但实际上很简单(我希望我能早点做)


仅供参考,上一次我查看OpenGL的最低公分母(2012年),它是OpenGL 3.3。实际上,AMD和NVidia的所有具有任何游戏功能的视频卡都将具有OpenGL 3.3。他们已经有一段时间了,所以现在为OpenGL 3.3编写的任何代码都可以在典型的低端或更好的GPU上运行。

问题是我的矩阵乘法顺序错了。我不知道这些操作是不可交换的

正确的顺序应该是:

projection * modelview * vertex

多亏了ltjax和doug65536

为什么要从OpenGL检索矩阵,然后将它们传递回OpenGL?是的,OpenGL-3核心不赞成使用矩阵数学函数,但不是为了让您实现一些环回。你应该自己计算或者使用一个专用的矩阵数学库。OpenGL状态机与固定的函数管道没有任何联系。此外,使用可编程着色器而不是固定函数,OpenGL仍然是一个状态机(在这种情况下,绑定着色器、纹理和缓冲区定义GL状态)。第二个版本中的矩阵顺序错误。应该是
projection*modelview*vertex
@Itjax谢谢!“我不知道这完全取决于订单,”贾斯汀梅纳斯说。矩阵乘法是非交换的(顺序很重要)。这就是为什么它们对于几何变换如此重要的原因,你可以将无限多的变换简化为一个变换。