ios - 基本三角形着色器不渲染

标签 ios objective-c opengl-es

我正在尝试在 iOS 上使用 openGL 渲染三角形。我有我的环境设置。我可以更改屏幕的背景颜色。我有一个基本的顶点和片段着色器,它可以成功编译并链接到程序。 glError() 也没有报告任何错误。

由于某种原因,我的三角形没有渲染。

我像这样设置帧缓冲区和渲染缓冲区:

glGenRenderbuffers(1, &_colorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:drawable];

GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER, _colorRenderBuffer);

然后我定义三角形的 3 个顶点:

_triangleMatrix[0] = -1.0; _triangleMatrix[1] = 0.0;
_triangleMatrix[2] = 0.0; _triangleMatrix[3] = 1.0;
_triangleMatrix[4] = 1.0; _triangleMatrix[5] = 0.0;

我创建并链接我的着色器。我不会在这里显示完整的代码,因为我没有收到编译或链接错误:

[self createVertexShader];
[self createFragmentShader];
[self linkProgram];

然后我使用该程序并获取属性“位置”插槽并启用它:

glUseProgram(_program);
_position_slot = glGetAttribLocation(_program, "position");
glEnableVertexAttribArray(_position_slot);

现在我需要设置我的 VBO。这是我最不确定的部分。

glGenBuffers(1, &_vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, _vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(_triangleMatrix), _triangleMatrix, GL_STATIC_DRAW);

然后这是我的 render() 方法:

    glClear(GL_COLOR_BUFFER_BIT);

    // 1rst attribute buffer : vertices
    glVertexAttribPointer(
                          _position_slot,
                          2,                  // size
                          GL_FLOAT,           // type
                          GL_FALSE,           // normalized?
                          0,                  // stride
                          (void*)0            // array buffer offset
                          );
    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle
    glDisableVertexAttribArray(0);
    [_context presentRenderbuffer:GL_RENDERBUFFER];

这是编译后的顶点着色器的代码:

NSString* vshader = \
@"attribute vec2 position; \
void main()\
{\
    gl_Position = vec4(position.x, position.y, 0.0, 1.0);\
}";

以及片段着色器:

NSString* fshader = \
@"void main()\
{\
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\
}";

基本上就是这样,对于整个文件,您可以查看此链接: https://gist.github.com/anonymous/6ed3f8231e76db35921ef260bfa6bf43

我认为问题是我的顶点着色器没有从我的 _triangleMatrix 成员接收“位置”数据。因此,要么属性设置不正确,要么 openGL 没有读取 _triangleMatrix 中的数据本身。无论如何,从我见过的每一个教程和指南来看,我相信我已经正确设置了它,但我却不知所措。

此外,glError() 不会返回任何错误,并且每个可检查错误的着色器编译或链接过程都不会报告错误。

有什么想法吗?

最佳答案

你缺少一些东西。

您错过的最重要的事情是设置视口(viewport):glViewport(x, y, width, height) 可能应该设置为渲染缓冲区的大小。这定义了您要绘制到缓冲区的哪一部分,并且必须手动设置。

第二个似乎是您在绘制调用结束时禁用顶点属性数组,但在调用开始时没有启用它。在您的情况下,禁用并不是真正必要的,只有在使用着色器(glUseProgram)时启用它才有意义。但总的来说,请确保您使用的所有属性均已启用。在您的代码中,三角形仅在第一帧绘制,然后在下一帧消失。

关于ios - 基本三角形着色器不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42350283/

相关文章:

ios - RXSwift - takeUntil 在下一个事件之前取消

ios - 在上下文上绘图时在 UIImage 上应用 CATransform3D

iphone - 完整整数的两倍

android - glsl es dFdx/dFdy 模拟

android - OpenGL ES 1.0 到 OpenGL ES 2.0,我不能画正方形

iphone - iphone 的动态图标更改

ios - 在 Game Center Enabled App 中处理 iOS Game Center App 中的选定回合/游戏

iOS 贝塞尔曲线路径显示为之字形

ios - 解雇 Controller 委托(delegate)方法不起作用

java - 设置 2D OpenGL ES 渲染器?