【问题标题】:GLSL OpenGL Polygons not renderingGLSL OpenGL多边形不渲染
【发布时间】:2013-10-13 20:23:02
【问题描述】:

我正在尝试使用 OpenGL 着色器来绘制一个简单的三角形。我试图在一个总体渲染类中将代码拆分为单独的方法,但是,我似乎无法让我的三角形在屏幕上渲染。这是我的 compileShaders() 方法,它编译并加载我的着色器源代码:

static const GLchar* vertexShaderSource[] = {
    "#version 430 core                          \n"
    "in vec4 vPosition;                         \n"
    "in vec4 vColor;                            \n"
    "out vec4 color;                            \n"
    "                                           \n"
    "void main() {                              \n"
    "   color = vColor;                         \n"
    "   gl_Position = vPosition;                \n"
    "}                                          \n"
};

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, vertexShaderSource, NULL);
glCompileShader(vertexShader);

program = glCreateProgram();
glAttachShader(program, vertexShader);
glLinkProgram(program);

glDeleteShader(vertexShader);

return program;

在另一种方法中,我调用 glewInit()、compileShaders(),然后设置顶点数组和顶点缓冲区对象。在此方法中,triangleVertices[] 和 triangleColors[] 是两个数组,其中包含三角形每个顶点的位置 (x,y,z) 和颜色值 (r,g,b,a)。

glewInit();
renderingProgram = compileShaders();

glEnable(GL_ARRAY_BUFFER);
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);

glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, numberOfVertices*7*sizeof(GLfloat), NULL, GL_STATIC_DRAW);

glBufferSubData(GL_ARRAY_BUFFER, 0, numberOfVertices*3*sizeof(GLfloat), triangleVertices);
glBufferSubData(GL_ARRAY_BUFFER, numberOfVertices*3*sizeof(GLfloat), numberOfVertices*4*sizeof(GLfloat), triangleColors);

GLuint vpos = glGetAttribLocation(renderingProgram, "vPosition"); 
glVertexAttribPointer(vpos, 3, GL_FLOAT, GL_FALSE, 0, 0); 

GLuint cpos = glGetAttribLocation(renderingProgram, "vColor");
glVertexAttribPointer(cpos, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numberOfVertices*3*sizeof(GLfloat)));   

glUseProgram(renderingProgram);
glEnableVertexAttribArray(vpos);
glEnableVertexAttribArray(cpos);

最后我的 render() 方法尝试绘制加载到数组缓冲区中的三角形:

const GLfloat color[] = {0.0f, 0.0f, 1.0f, 1.0f};
glClearBufferfv(GL_COLOR, 0, color);

glUseProgram(renderingProgram);

glDrawArrays(GL_TRIANGLES, 0, 3);
SwapBuffers(hDC_);

我正在渲染到一个设置在不同类中的 Win32 窗口。渲染后我可以看到蓝屏,所以看起来glClearBufferfv 调用工作正常。然而,我的三角形无处可寻。如果我将渲染模式更改为glDrawArrays(GL_POINTS, 0, 1),我会在屏幕中间看到一个白色像素。

我做错了什么?

【问题讨论】:

  • 请原谅我的无知,但OpenGL 3.x 是否也需要片段着色器作为着色器程序的一部分?另外,请发布顶点缓冲区代码。您不会剔除或渲染到超小的视口,对吧?
  • 你检查过glLinkProgram(program);的返回值吗?恐怕这会失败,因为您没有提供片段着色器。此外,您的顶点着色器源看起来很奇怪。
  • 既然你刚刚开始,我建议你看看:arcsynthesis.org/gltut/Basics/Tutorial%2001.html 那里有一些很棒的代码和框架,你可以重复使用这些代码(编译、链接着色器和打印错误。 .etc)
  • 我发现我的着色器没有使用version 440 core 进行编译。一旦我更改为version 330 core,它们就会正确编译。添加片段着色器解决了渲染问题。非常感谢您的帮助!

标签: c++ opengl glsl


【解决方案1】:

正如其他人指出的那样,您也需要一个片段着色器,例如,

#version 430

in vec4 color;
out vec4 frag_rgba; // default index (0) (glFragBindDataLocation)

void main (void) {
    frag_rgba = color;
}

在链接之前将此着色器与顶点着色器一起附加到程序中。您可以在链接后从程序中detach 着色器。您也可以考虑在顶点着色器中使用explicit attribute indices

【讨论】:

  • 我添加了一个片段着色器,这似乎解决了这个问题。而且看起来我的着色器没有使用version 430 core 正确编译。一旦我将其更改为version 330 core,它就会编译!非常感谢您的帮助
猜你喜欢
  • 2011-08-16
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2015-05-10
  • 2013-10-05
相关资源
最近更新 更多