val*_*lmo 5 iphone opengl-es opengl-es-2.0
我试图从opengles docs http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html中实现我自己的glOtho函数
来修改我的顶点着色器中的Projection矩阵.它目前无法正常工作,因为我看到我的简单三角形顶点不合适.你可以检查下面的代码,看看我做错了什么.
我已经尝试将tx,ty和tz设置为0,这似乎使它正确渲染.任何想法为什么会这样?
void ES2Renderer::_applyOrtho(float left, float right,float bottom, float top,float near, float far) const{
float a = 2.0f / (right - left);
float b = 2.0f / (top - bottom);
float c = -2.0f / (far - near);
float tx = - (right + left)/(right - left);
float ty = - (top + bottom)/(top - bottom);
float tz = - (far + near)/(far - near);
float ortho[16] = {
a, 0, 0, tx,
0, b, 0, ty,
0, 0, c, tz,
0, 0, 0, 1
};
GLint projectionUniform = glGetUniformLocation(_shaderProgram, "Projection");
glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);
}
void ES2Renderer::_renderScene()const{
GLfloat vVertices[] = {
0.0f, 5.0f, 0.0f,
-5.0f, -5.0f, 0.0f,
5.0f, -5.0f, 0.0f};
GLuint positionAttribute = glGetAttribLocation(_shaderProgram, "Position");
glEnableVertexAttribArray(positionAttribute);
glVertexAttribPointer(positionAttribute, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(positionAttribute);
}
Run Code Online (Sandbox Code Playgroud)
垂直着色器
attribute vec4 Position;
uniform mat4 Projection;
void main(void){
gl_Position = Projection*Position;
}
Run Code Online (Sandbox Code Playgroud)
解决方案 来自Nicols的答案我在下面修改了我的矩阵,它似乎正确渲染
float ortho[16] = {
a, 0, 0, 0,
0, b, 0, 0,
0, 0, c, 0,
tx, ty, tz, 1
};
Run Code Online (Sandbox Code Playgroud)
重要说明 您不能将GL_TRUE用于glUniform的转置参数,如下所示.opengles不支持它.它必须是GL_FALSE
glUniformMatrix4fv(projectionUniform, 1, GL_TRUE, &ortho[0]);
Run Code Online (Sandbox Code Playgroud)
来自http://www.khronos.org/opengles/sdk/docs/man/xhtml/glUniform.xml
transpose指定在将值加载到统一变量时是否转置矩阵.必须是GL_FALSE.
| 归档时间: |
|
| 查看次数: |
5372 次 |
| 最近记录: |