在 OpenGL ES 2 上渲染简单正方形的错误转换 (iOS)
Wrong Transformation Rendering a Simple Square on OpenGL ES 2 (iOS)
我正在从头学习 OpenGL ES2(我的 Reference)。我想在屏幕中央渲染一个大小为 2 的简单正方形。
这是我的正方形(2 个三角形):
typedef struct {
float Position[3];
float Color[4];
} Vertex;
const Vertex Vertices[] = {
{{1, -1, 0}, {1, 0, 0, 1}},
{{1, 1, 0}, {0, 1, 0, 1}},
{{-1, 1, 0}, {0, 0, 1, 1}},
{{-1, -1, 0}, {0, 0, 0, 1}}
};
const GLubyte Indices[] = {
0, 1, 2,
2, 3, 0
};
我在 Google 上将图层、上下文、渲染设置为一些流行的示例。
这是我的顶点着色器:
attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2
varying vec4 DestinationColor; // 3
uniform mat4 Projection;
void main(void) { // 4
DestinationColor = SourceColor; // 5
gl_Position = Projection * Position;
}
这是我的渲染函数:
-(void)render:(CADisplayLink*)displayLink
{
glViewport(0, 0, self.frame.size.width, self.frame.size.height);
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// Setup Projection Matrix
GLfloat aspect = self.frame.size.height / self.frame.size.width;
//GLKMatrix4 mat = GLKMatrix4MakeFrustum(-2, 2, -2*aspect, 2*aspect, 2, 100);
GLKMatrix4 mat = GLKMatrix4MakeOrtho(-2.0, 2.0, -2.0*aspect, 2.0*aspect, 0, 100);
glUniformMatrix4fv(_projectionUniform, 1, 0, mat.m);
// Setup color & vertices
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));
// Draw...
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]),
GL_UNSIGNED_BYTE, 0);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
我设置了 Othor 项目矩阵,宽度为 4,高度为 1.77*4(iPhone 的 16:9)。我希望屏幕中央有一个正方形,但我得到的却是一个矩形:
大小和位置不是我所期望的。我做错了什么 ?
我也更改为 GLKMatrix4MakeFrustum,但也收到相同的结果。
你也可以在这里下载我的项目:
https://www.mediafire.com/?w0tb74z5tk0xig0
感谢您阅读我的长问题。
经过半天的逐行检查代码。
我发现 AutoLay-Out 是问题的原因。关闭自动布局,一切正常。
只是不要使用自动布局来调整 OPENGL 视图的大小。也许它会影响由 OpenGL 渲染的 CA 层。
我正在从头学习 OpenGL ES2(我的 Reference)。我想在屏幕中央渲染一个大小为 2 的简单正方形。
这是我的正方形(2 个三角形):
typedef struct {
float Position[3];
float Color[4];
} Vertex;
const Vertex Vertices[] = {
{{1, -1, 0}, {1, 0, 0, 1}},
{{1, 1, 0}, {0, 1, 0, 1}},
{{-1, 1, 0}, {0, 0, 1, 1}},
{{-1, -1, 0}, {0, 0, 0, 1}}
};
const GLubyte Indices[] = {
0, 1, 2,
2, 3, 0
};
我在 Google 上将图层、上下文、渲染设置为一些流行的示例。
这是我的顶点着色器:
attribute vec4 Position; // 1
attribute vec4 SourceColor; // 2
varying vec4 DestinationColor; // 3
uniform mat4 Projection;
void main(void) { // 4
DestinationColor = SourceColor; // 5
gl_Position = Projection * Position;
}
这是我的渲染函数:
-(void)render:(CADisplayLink*)displayLink
{
glViewport(0, 0, self.frame.size.width, self.frame.size.height);
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
// Setup Projection Matrix
GLfloat aspect = self.frame.size.height / self.frame.size.width;
//GLKMatrix4 mat = GLKMatrix4MakeFrustum(-2, 2, -2*aspect, 2*aspect, 2, 100);
GLKMatrix4 mat = GLKMatrix4MakeOrtho(-2.0, 2.0, -2.0*aspect, 2.0*aspect, 0, 100);
glUniformMatrix4fv(_projectionUniform, 1, 0, mat.m);
// Setup color & vertices
glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));
// Draw...
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]),
GL_UNSIGNED_BYTE, 0);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
我设置了 Othor 项目矩阵,宽度为 4,高度为 1.77*4(iPhone 的 16:9)。我希望屏幕中央有一个正方形,但我得到的却是一个矩形:
大小和位置不是我所期望的。我做错了什么 ? 我也更改为 GLKMatrix4MakeFrustum,但也收到相同的结果。
你也可以在这里下载我的项目: https://www.mediafire.com/?w0tb74z5tk0xig0
感谢您阅读我的长问题。
经过半天的逐行检查代码。
我发现 AutoLay-Out 是问题的原因。关闭自动布局,一切正常。
只是不要使用自动布局来调整 OPENGL 视图的大小。也许它会影响由 OpenGL 渲染的 CA 层。