【问题标题】:OpenGL - Problems getting even simple rendering to work with shadersOpenGL - 使用着色器进行简单渲染的问题
【发布时间】:2012-07-22 05:20:12
【问题描述】:

我正在尝试让我非常简单的着色器与我当前的 OpenGL 设置一起工作。我正在使用着色器管理器,并且在加载着色器时,所有输出都表示它们已正确加载。

这是我的数据:

static const GLfloat g_vertex_buffer_data[] = {
    -1.0f, -1.0f, 0.0f,
    1.0f, -1.0f, 0.0f,
    0.0f,  1.0f, 0.0f,
};

这是我设置缓冲区的地方:

// This will identify our vertex buffer
GLuint vertexbuffer;

// Generate 1 buffer, put the resulting identifier in vertexbuffer
glGenBuffers(1, &vertexbuffer);

// The following commands will talk about our 'vertexbuffer' buffer
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);

// Give our vertices to OpenGL.
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

这是我使用经过测试和工作的着色器加载器对我的着色器的声明:

Shader shader;
shader.loadFromFile(VERTEX_SHADER, resourcePath() + "tri.vert");
shader.loadFromFile(FRAGMENT_SHADER, resourcePath() + "tri.frag");
shader.createAndLinkProgram();
shader.use();
shader.addAttribute("position");
shader.unUse();

然后将此着色器的属性存储在地图中。这是渲染调用:

shader.use();

    glEnableVertexAttribArray(shader["position"]);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
                          shader["position"], // attribute 0. No particular reason for 0, but must match the layout in the shader.
                          3,                  // 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(shader["position"]);

    shader.unUse();

然后我交换缓冲区。我尝试使用旧的 GL_TRIANGLES 固定管道图,效果很好。

这是我的顶点着色器:

#version 330
layout(location = 0) in vec3 position;

void main()
{
gl_Position.xyz = position;
} 

这是我的片段着色器:

out vec3 color;

main()
{
color = vec3(1,0,0);
}

它应该简单地绘制一个红色三角形。当我使用中间模式绘制时,它渲染得很好。我在 Mac OSX 10.7.4 上运行 Xcode。

【问题讨论】:

  • 什么是“中间模式”?如果您说的是即时模式 (glBegin/glEnd),您是指使用固定功能 T&L,还是使用此着色器?
  • 通过固定函数,我只是假设可编程着色器被认为是可编程管道,而 glBegin 和 glEnd 是旧的过时的固定管道函数。

标签: opengl shader


【解决方案1】:

gl_Position.xyz = 位置;

W 坐标是多少?重要的是不要让它未定义。如果您希望它是 1.0,则需要将其设置为:

gl_Position = vec4(position, 1.0);

【讨论】:

  • 这并没有起到作用,但仍然很高兴知道。我正在使用着色器来尝试渲染它。中间模式,我只是说我用了一会儿,看看我的上下文和相机是否设置正确。它是。还有其他建议吗?
  • 我认为问题出在属性函数上。我会在这方面工作。谢谢你尼科尔。当我有 OpenGL 问题时,我总是喜欢看到你出现。您是否以使用 OpenGL 为生?
【解决方案2】:

gl_Position 必须提供 x,y,z,w 坐标。 在 1.50 以上的 GLSL 版本中,您必须在着色器中提供矩阵操作,即您必须使用诸如 GLM http://glm.g-truc.net/ 之类的数学库来完成投影、模型、视图矩阵。

从顶点数据集中,z 坐标是 0.0,它与场景的中心同在。证明 Z 坐标的一些 -ve 值并检查结果。

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多