如何在OpenGL 3.3中修复黑屏输出
How to fix black screen output in OpenGL 3.3
我在使用 OpenGL 和 C++ 的项目中遇到黑屏。我需要帮助,了解我在哪里出错了,将红色三角形渲染到屏幕上。
我尝试检查顶点和片段着色器中的错误。
#include <GLglew.h>
#include <GLGL.h>
#include <GLFWglfw3.h>
#include <iostream>
#include <string>
using namespace std;
unsigned int CreateShader(int type, const string shaderSource) {
unsigned int shader = glCreateShader(type);
const char *src = shaderSource.c_str();
glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
int result;
glGetShaderiv(shader, GL_COMPILE_STATUS, &result);
if (result == GL_FALSE) {
int length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
char *message = (char*)alloca(length * sizeof(char));
glGetShaderInfoLog(shader, length, &length, message);
cout << "Failed to compile " << (type == GL_VERTEX_SHADER ? "vertex shader " : "fragment shader ") << endl;
cout << message << endl;
}
return shader;
}
unsigned int CreateProgram(const string vertexShader, const string fragmentShader) {
unsigned int program = glCreateProgram();
unsigned int vs = CreateShader(GL_VERTEX_SHADER, vertexShader);
unsigned int fs = CreateShader(GL_FRAGMENT_SHADER, fragmentShader);
glAttachShader(program, vs);
glAttachShader(program, fs);
glDeleteShader(vs);
glDeleteShader(fs);
glLinkProgram(program);
glValidateProgram(program);
return program;
}
int main() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow *window = glfwCreateWindow(800, 600, "window", NULL, NULL);
glfwMakeContextCurrent(window);
glewInit();
if (glewInit() != GLEW_OK) {
cout << "Glew initialization Failed! " << endl;
glfwTerminate();
return -1;
}
float positions[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f,
};
cout << "Made By Rial Seebran" << endl;
cout << glfwGetVersionString() << endl;
unsigned int VAO;
unsigned int VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
const string vertexShader =
"#version 330 coren"
"layout (location = 0) in vec3 position;n"
"void main() {n"
"gl_Position = vec4(position, 0.0f);n"
"}n";
const string fragmentShader =
"#version 330 coren"
"layout (location = 0) out vec4 color;n"
"void main() {n"
"color = vec4(1.0f, 0.0f, 0.0f, 1.0f);n"
"}n";
unsigned int program = CreateProgram(vertexShader, fragmentShader);
while (!glfwWindowShouldClose(window)) {
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glBindVertexArray(VAO);
glDrawArrays(GL_ARRAY_BUFFER, 0, 3);
glBindVertexArray(0);
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}
我期待在用蓝色背景指定的坐标处绘制一个红色三角形。
要glDrawArrays
的第一个参数必须是基元类型。
它必须是GL_TRIANGLES
而不是GL_ARRAY_BUFFER
:
glDrawArrays(GL_ARRAY_BUFFER, 0, 3);
glDrawArrays(GL_TRIANGLES, 0, 3);
OpenGL 枚举器常量GL_ARRAY_BUFFER
不是此参数的可接受值,将导致GL_INVALID_ENUM
错误(错误可以通过glGetError
获得)。
当剪辑空间坐标转换为规范化设备空间时,x
、y
和z
分量被w
分量除以。 这意味着gl_Position
的w
组件必须设置为 1.0 而不是 0.0:
gl_Position = vec4(position, 0.0f);
gl_Position = vec4(position, 1.0);
Glew 可以通过glewExperimental = GL_TRUE;
启用其他扩展。请参阅GLEW文档,其中说:
GLEW 从图形驱动程序获取有关支持的扩展的信息。但是,实验性或预发布驱动程序可能不会通过标准机制报告每个可用的扩展,在这种情况下,GLEW 将报告它不受支持。为了规避这种情况,可以通过在调用
glewInit()
之前将其设置为GL_TRUE
来打开glewExperimental
全局开关,从而确保所有具有有效入口点的分机都将公开。
glewExperimental = GL_TRUE;
if ( glewInit() != GLEW_OK ) {
cout << "Glew initialization Failed! " << endl;
glfwTerminate();
return -1;
}
相关文章:
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- Opengl 4 调试输出不起作用
- OpenGL,纹理输出为纯色
- 如何在OpenGL 3.3中修复黑屏输出
- 简单的openGL画线程序没有输出
- OpenGL:计算着色器 - gl_GlobalInvocationID提供静态输出
- opengl 3.3 中的黑屏输出
- SDL_ttf和OpenGL正在输出看似随机的垃圾和崩溃
- 为什么我的OpenGL引擎中没有从MyGUI获得任何屏幕输出
- 屏幕截图而不是 OpenGL 中的输出
- 文本不会在屏幕C++/OpenGL上输出
- 使用x264将OpenGL输出转换为H264
- 使用 GL_POLYGON 在 OpenGL 中绘制多边形时获得意外输出
- OpenGL 3.30/GLSL 3.30-MRT输出黑色纹理
- 用visual studio和C++/OpenGL进行cout输出
- 使用 OpenGL 对程序输出进行 3D 显示
- 为什么这个openGL代码没有输出任何东西
- 如何在OpenGL中输出变量数
- OpenGL不显示正确的输出时,没有运行在cmd提示符
- 丢失的OpenGL输出