2011-04-11 51 views
4

嗨,我开始将我的一个项目从固定管道移开,所以尝试一下,我尝试着写一个着色器,它只是简单地传递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%积极的这些矩阵是正确的,然后我通过他们顺便说一句)任何想法?

+0

为什么你检索OpenGL的矩阵,然后将它们传递回吗?是的,OpenGL-3核心降低了基础数学函数的功能,但不是为了让你实现一些环回。你应该自己做数学或者使用专门的矩阵数学库。 – datenwolf 2011-04-11 17:00:50

+1

OpenGL状态机与固定功能管道无关。此外,使用可编程着色器代替固定功能OpenGL仍然是一个状态机(在这种情况下,绑定着色器,纹理和缓冲区定义GL状态)。 – datenwolf 2011-04-11 17:01:49

+3

矩阵顺序在第二个版本中是错误的。应该是'projection * modelview * vertex'。 – ltjax 2011-04-11 17:05:28

回答

2

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

正确的顺序应该是:

projection * modelview * vertex 

感谢ltjax和doug65536

2

对于矩阵运算,请尝试使用外部库,例如GLM。他们也有一些基本的examples关于如何创建必要的矩阵和做投影*视图*模型转换。

0

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

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

使用更新,更明确的风格声明输入和输出,并将它们设置在您的代码中。这真的不坏。我认为这会很难看,但实际上很简单(我希望我早些时候做过)。仅供参考,我上次查看OpenGL(2012)的最低公分母时,是OpenGL 3.3。几乎所有具有任何游戏功能的AMD和NVidia的显卡都将拥有OpenGL 3.3。而且他们已经有一段时间了,所以现在为OpenGL 3.3编写的任何代码都适用于典型的低端GPU或更好的GPU。