c - 在现代 OpenGL 中渲染三角形时遇到问题
问题描述
我期待程序在灰色背景上渲染一个简单的三角形,但它渲染 了一个背景但没有三角形。
我的编译器没有显示警告或错误,SDL2或GLAD也没有。我得出的结论是,这种行为的原因包含在这两个代码片段中的任何一个中。作为参考,我正在用 C 语言进行编程,并使用 OpenGL 4.2。
在 shader.h 中
#ifndef SHADER_H
#define SHADER_H
// vertex shader
const char* vertexShaderSrc =
"#version 420 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
unsigned int vShader;
// fragment shader
const char* fragmentShaderSrc =
"#version 420 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
"}\n\0";
unsigned int fShader;
// shader program
unsigned int sProgram;
#endif // SHADER_H
在 main.c 中
// SETUP TRIANGLE
float triVertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, -0.5f, 0.0f
};
// vertex buffer object / vertex array object
unsigned int vbo, vao;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
// vao
glBindVertexArray(vao);
// vbo
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(triVertices), triVertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// vertex shader
vShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vShader, 1, &vertexShaderSrc, NULL);
glCompileShader(vShader);
glGetShaderiv(vShader, GL_COMPILE_STATUS, &success);
if(!success) {
glGetShaderInfoLog(vShader, 512, NULL, infoLog);
printf("vertex shader error: %s\n", infoLog);
isRunning = false;
}
// fragment shader
fShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fShader, 1, &fragmentShaderSrc, NULL);
glCompileShader(fShader);
glGetShaderiv(fShader, GL_COMPILE_STATUS, &success);
if(!success) {
glGetShaderInfoLog(fShader, 512, NULL, infoLog);
printf("fragment shader error: %s\n", infoLog);
isRunning = false;
}
// shader program
sProgram = glCreateProgram();
glAttachShader(sProgram, vShader);
glAttachShader(sProgram, fShader);
glLinkProgram(sProgram);
glGetProgramiv(sProgram, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(sProgram, 512, NULL, infoLog);
printf("shader program errror: %s\n", infoLog);
isRunning = false;
}
glDeleteShader(vShader);
glDeleteShader(fShader);
// APPLICATION LOOP
while(isRunning) {
while(SDL_PollEvent(&event)) {
switch(event.type) {
case SDL_QUIT:
isRunning = false;
break;
default:
break;
}
}
// display
glClearColor(0.15f, 0.15f, 0.15f, 1.0f);
glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glUseProgram(sProgram);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
SDL_GL_SwapWindow(window);
}
我试图通过更改数字函数的放置顺序、为这些函数指定不同的值以及修改我的着色器的源代码来解决我的问题。这些操作似乎都不起作用,因此我已将代码恢复为原始状态。我回顾了我的参考资料,看看我是否遗漏了什么,但我无法找到任何东西。
解决方案
好像你的三角形的顶点有相同的 Y 坐标
float triVertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, -0.5f, 0.0f
};
应该
float triVertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, +0.5f, 0.0f // here I have changed -0.5 to +0.5
};
小更新:发布后我查看了参考资料,这证实了我的猜测。三角形的第三个顶点具有相同的 Y 值。
只要 SDL 和 OpenGL 的着色器编译器不产生任何警告,程序的其余部分似乎都很好。
推荐阅读
- c# - 我怎样才能提高我的“比较”方法效率?
- reactjs - 在 Android 上弹出的 Expo 项目上运行 Realm 并出现错误
- java - 将带有自定义实现方法的通用枚举作为参数传递
- php - 数据附加到产生不正确结果的 php Implode 语句
- linux - Snap 无法运行,snap.tar.gz 已经退出
- java - IDEA intellij 如何停止常量重新格式化?
- android - gradle(右侧)中的Android studio 4.2.1 siginig报告无法找到
- powershell - 使用 Powershell 将文件上传到 Sharepoint Online (Microsoft 365)(选项 3 - 使用 System.Net.WebClient)
- reactjs - TypeError:无法读取注销按钮上未定义链接的属性“推送”
- javascript - svg 带双边框的多边形