gpt4 book ai didi

c++ - GLSL OpenGL 多边形不渲染

转载 作者:行者123 更新时间:2023-11-28 07:21:50 27 4
gpt4 key购买 nike

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

我做错了什么?

最佳答案

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

#version 430

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

void main (void) {
frag_rgba = color;
}

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

关于c++ - GLSL OpenGL 多边形不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com