使用glCreateVertexArrays时出现黑屏
Getting black screen when using glCreateVertexArrays
本文关键字:glCreateVertexArrays 使用 更新时间:2023-10-16
我现在正在学习opengl。我买了一本名为OpenGL Superbible的书。但我没能幸存下来,正确地配置环境。我使用GLFW 3.2作为窗口工具包(如果这就是它的名字的话)和GLEW 2.0。
我正在尝试编译并使用着色器在屏幕上绘制。根据这本书,这应该在屏幕上画一个三角形。但事实并非如此。相反,它显示由glClearColor
设置的清晰背景色。
这是代码:
#include <iostream>
#include <GLFWglfw3.h>
#include <GLglew.h>
GLuint CompileShaders();
int main(void) {
// Initialise GLFW
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFWn");
getchar();
return -1;
}
// Open a window and create its OpenGL context
GLFWwindow *window;
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, "
"they are not 3.3 compatible. Try the 2.1 version of the "
"tutorials.n");
getchar();
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// Initialize GLEW
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEWn");
getchar();
glfwTerminate();
return -1;
}
// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
GLuint RederingProgram = CompileShaders();
GLuint VertexArrayObject;
glCreateVertexArrays(1, &VertexArrayObject);
glBindVertexArray(VertexArrayObject);
int LoopCounter = 0;
do {
// Clear the screen. It's not mentioned before Tutorial 02, but it can cause
// flickering, so it's there nonetheless.
/*const GLfloat red[] = {
(float)sin(LoopCounter++ / 100.0f)*0.5f + 0.5f,
(float)cos(LoopCounter++ / 100.0f)*0.5f + 0.5f,
0.0f, 1.0f
};*/
// glClearBufferfv(GL_COLOR, 0, red);
// Draw nothing, see you in tutorial 2 !
glUseProgram(RederingProgram);
glDrawArrays(GL_TRIANGLES, 0, 3);
// Swap buffers
glfwSwapBuffers(window);
glfwPollEvents();
} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0);
// Close OpenGL window and terminate GLFW
glfwTerminate();
return 0;
}
GLuint CompileShaders() {
GLuint VertexShader;
GLuint FragmentShader;
GLuint Program;
static const GLchar *VertexShaderSource[] = {
"#version 450 core "
" "
"n",
" "
" n",
"void main(void) "
" "
"n",
"{ "
" "
" n",
"const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),n",
" "
"vec4(-0.25, -0.25, 0.5, 1.0),n",
" "
"vec4(0.25, 0.25, 0.5, 1.0)); n",
" gl_Position = vertices[gl_VertexID]; n",
"} "
" "
" n"};
static const GLchar *FragmentShaderSource[] = {
"#version 450 core "
" "
"n",
" "
" n",
"out vec4 color; n",
" "
" n",
"void main(void) "
" "
"n",
"{ "
" "
" n",
" color = vec4(0.0, 0.8, 1.0, 1.0); n",
"} "
" "
" n"};
// Create and compile vertex shader.
VertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertexShader, 1, VertexShaderSource, NULL);
glCompileShader(VertexShader);
// Create and compile fragment shader.
FragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(FragmentShader, 1, FragmentShaderSource, NULL);
glCompileShader(FragmentShader);
// Create program, attach shaders to it, and link it
Program = glCreateProgram();
glAttachShader(Program, VertexShader);
glAttachShader(Program, FragmentShader);
glLinkProgram(Program);
// Delete the shaders as the program has them now.
glDeleteShader(FragmentShader);
glDeleteShader(VertexShader);
return Program;
}
我在视觉工作室2015工作。我有所有的库来开发一些opengl(我想),但有些是错误的。请帮帮我。顺便说一句,glCreateVertexArrays()
函数只在Opengl 4.5及更高版本中,我知道,因为这本书是在Opengl 4.5中解释的。
我很快就会发疯,因为没有适合初学者的教程。学会这一点的人都是雄心勃勃的人。我在那些人面前鞠躬。
着色器不应该编译:
glShaderSource(VertexShader, 1, VertexShaderSource, NULL);
这告诉总账,它应该期望一个1GLchar指针的数组。然而,您的GLSL代码实际上被拆分为几个单独的字符串(注意逗号);
static const GLchar *VertexShaderSource[] = { "...GLSL-code..." "...GLSL-code..." "...GLSL-code...", // <- this comma ends the first string vertexShaderSource[0] "...GLSL-code..." // vertexShaderSource[1] starts here [...]
有两种可能的解决方案:
- 只需删除这些逗号,这样您的数组就只包含一个元素,该元素作为一个字符串指向整个GLSL源
-
告诉德国劳埃德船级社你的数据的真相:
glShaderSoure(..., sizeof(vertexShaderSource)/sizeof(vertexShaderSource[0]), vertexShaderSource, ,,,)
除此之外,还应始终查询着色器和程序对象的编译和链接状态。同时查询着色器编译和程序链接信息日志。它们将包含人工可读消息,告诉您编译/链接失败的原因。
相关文章:
- 没有找到相关文章