2013-10-13 102 views
0

我想用OpenGL着色器绘制一个简单的三角形。我试图将代码拆分成一个整体渲染类中的单独方法,但是,我似乎无法让我的三角形在屏幕上呈现。这是编译和加载我的着色器的源代码我compileShaders()方法:())GLSL OpenGL多边形不渲染

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); 

最后我使我在其中尝试()方法,并绘制加载到数组缓冲区的三角:

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),我会在屏幕中间看到一个白色像素。

我在做什么错?

+3

请原谅我的无知,但没有OpenGL 3.x也需要片段着色器,作为着色器程序的一部分? 另外,请张贴顶点缓冲区代码。你不是扑杀或渲染一个超小视口,对吧? – Raja

+1

您是否检查过'glLinkProgram(program);'的返回值?恐怕这会失败,因为你没有提供片段着色器。你的顶点着色源也很奇怪。 – starrify

+0

既然你刚开始,我建议你看看: http://arcsynthesis.org/gltut/Basics/Tutorial%2001.html 有一些很棒的代码和框架,你可以重复使用代码(编译,链接着色器和打印错误..等) – Raja

回答

1

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

#version 430 

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

void main (void) { 
    frag_rgba = color; 
} 

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

+0

我添加了一个片段着色器,似乎解决了这个问题。另外它看起来像我的着色器没有正确编译使用'版本430核心'。一旦我将其更改为“330版本核心”,它就会编译!非常感谢您的帮助 –