Opengl 什么也没画,只是告诉我没有错误
Opengl is drawing nothing but telling me there is no errors
当我运行程序时,window只是黑色。我一直在使用本教程 https://open.gl/drawing。虽然我没有逐字复制它。 glgeterror
出现了 0。我的代码有什么问题。我使用了 9 个数组元素而不是教程中建议的 6 个,但弥补了它。
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(){
//window initalization
if(!glfwInit()){
fprintf(stderr,"failed glfw initialization");
return -1;
}
GLFWwindow* window = glfwCreateWindow(800,800,"i hope this works",NULL,NULL);
if (!window){
fprintf(stderr,"window creation failed");
return -1;
}
glfwMakeContextCurrent(window);
//glew initialization
glewExperimental = 1;
if(glewInit() != GLEW_OK){
fprintf(stderr,"glew failed to initialize");
return -1;
//vertex specification(vs)
//vertex array object(vs)
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
//vertex buffer object(vs)
GLuint vbo;
glGenBuffers(1, &vbo);
//vertex data(vs)
const GLfloat tri_verts[] = {
-1.0f,1.0f,0.0f,
-1.0f,0.0f,0.0f,
1.0f,0.0f,0.0f};
//-west +east -south +north -farther +closer
//{{x,y,z}{x,y,z}{x,y,z}}
//just a nemonic to associate which direction each letter goes.
//bind the vertices to the buffer(vs)
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER,sizeof(tri_verts),tri_verts,GL_STATIC_DRAW);
//vertex processing(vp)
//vertex shader(vp)
const GLchar* Vshader_source = "\
version 330 \
in vec3 position; \
void main() \
\
gl_Position = vec4(position,1.0); \
\
";
//fragment shader(vp)
const GLchar* Fshader_source = "\
#version 330\
out vec4 outColor;\
void main()\
{\
outColor = vec4(1.0, 1.0, 1.0, 1.0);\
}";
//shader compilation(vp)
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1,&Vshader_source,NULL);
glCompileShader(vertexShader);
//vertex shader compilation status
GLint Vstatus;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &Vstatus);
char Vbuffer[512];
glGetShaderInfoLog(vertexShader, 512, NULL, Vbuffer);
fprintf(stderr,"%s",Vbuffer);
fprintf(stderr,"\n\n");
//fragment shader compilation
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &Fshader_source, NULL);
glCompileShader(fragmentShader);
//Fragment shader compilation status
GLint Fstatus;
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &Fstatus);
char Fbuffer[512];
glGetShaderInfoLog(fragmentShader, 512, NULL, Fbuffer);
fprintf(stderr,"%s",Fbuffer);
//shader program creation
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram,vertexShader);
glAttachShader(shaderProgram,fragmentShader);
glBindFragDataLocation(shaderProgram,0,"outcolor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
//tell opengl how to interpret and format the vertices data
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib,3, GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(posAttrib );
//vertex post-processing(fixed)
//Primitive assembly(fixed)
//Rasterization(fixed)
//Fragment Processing(fixed)
//per-sample operations(fixed)
}
char error_num = 0;
while(!glfwWindowShouldClose(window)){
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (!error_num){
fprintf(stderr,"%d",glGetError());
error_num++;
}
glDrawArrays(GL_TRIANGLES,0,3);
glfwSwapBuffers(window);
glfwPollEvents();
}
}
- 在
Vshader_source
中:version 330
!= #version 330
。我强烈怀疑你的着色器不是compiling/linking原样。
#version
指令后面需要实际的大写 \n
换行符。续行不足。
- 使用
GL_COMPILE_STATUS
位做一些事情(比如转储编译日志并退出),而不是盲目地执行程序。
- 在 glLinkProgram() 之后检查
GL_LINK_STATUS
并根据需要转储 link 日志。
- 如果要使用
#version 330
,请在 window 创建时明确请求(通过 glfwWindowHint()
与 GLFW_CONTEXT_VERSION_MAJOR
和 GLFW_CONTEXT_VERSION_MINOR
)3.3 版上下文,现在你只是有点 希望 你会得到 3.3.
- 要获得额外的防弹效果,请设置 GLFW error callback。
随意使用来自 的着色器加载器 class。
对我来说似乎是几个错别字的问题。一、大的:
if(glewInit() != GLEW_OK){
fprintf(stderr,"glew failed to initialize");
return -1;
此错误检查没有右括号。所以你的大部分程序实际上都没有执行,因为它在 inside 这个块中。
你的顶点着色器:
version 330
in vec3 position;
void main()
gl_Position = vec4(position,1.0);
version 330
应该是 #version 330
。 main
应该有牙套。
更正版本:
#version 330
in vec3 position;
void main() {
gl_Position = vec4(position,1.0);
}
正如 genpfault 所提到的,您也没有包含换行符 (\n
)。没关系(如果有点......丑陋)对于大多数事情,但不适用于指令,如#version
。后面需要一个换行符。
将来,您真的应该省去一些麻烦,从文件中加载着色器,而不是将它们作为多行字符串嵌入。说到这里,如果您真的 打算像那样使用多行字符串,请这样做:
const GLchar* Vshader_source =
"#version 330\n"
"in vec3 position;"
"void main() {"
" gl_Position = vec4(position,1.0);"
"}";
预处理器会自动连接仅由空格分隔的常量字符串。比所有那些反斜杠更易于管理!
接下来,
glBindFragDataLocation(shaderProgram,0,"outcolor");
在片段着色器中,您将其称为 outColor
,而不是 outcolor
。案例很重要!
不,我不确定我是否全部抓住了它们,但是...这应该是一个开始?
当我运行程序时,window只是黑色。我一直在使用本教程 https://open.gl/drawing。虽然我没有逐字复制它。 glgeterror
出现了 0。我的代码有什么问题。我使用了 9 个数组元素而不是教程中建议的 6 个,但弥补了它。
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(){
//window initalization
if(!glfwInit()){
fprintf(stderr,"failed glfw initialization");
return -1;
}
GLFWwindow* window = glfwCreateWindow(800,800,"i hope this works",NULL,NULL);
if (!window){
fprintf(stderr,"window creation failed");
return -1;
}
glfwMakeContextCurrent(window);
//glew initialization
glewExperimental = 1;
if(glewInit() != GLEW_OK){
fprintf(stderr,"glew failed to initialize");
return -1;
//vertex specification(vs)
//vertex array object(vs)
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
//vertex buffer object(vs)
GLuint vbo;
glGenBuffers(1, &vbo);
//vertex data(vs)
const GLfloat tri_verts[] = {
-1.0f,1.0f,0.0f,
-1.0f,0.0f,0.0f,
1.0f,0.0f,0.0f};
//-west +east -south +north -farther +closer
//{{x,y,z}{x,y,z}{x,y,z}}
//just a nemonic to associate which direction each letter goes.
//bind the vertices to the buffer(vs)
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER,sizeof(tri_verts),tri_verts,GL_STATIC_DRAW);
//vertex processing(vp)
//vertex shader(vp)
const GLchar* Vshader_source = "\
version 330 \
in vec3 position; \
void main() \
\
gl_Position = vec4(position,1.0); \
\
";
//fragment shader(vp)
const GLchar* Fshader_source = "\
#version 330\
out vec4 outColor;\
void main()\
{\
outColor = vec4(1.0, 1.0, 1.0, 1.0);\
}";
//shader compilation(vp)
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1,&Vshader_source,NULL);
glCompileShader(vertexShader);
//vertex shader compilation status
GLint Vstatus;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &Vstatus);
char Vbuffer[512];
glGetShaderInfoLog(vertexShader, 512, NULL, Vbuffer);
fprintf(stderr,"%s",Vbuffer);
fprintf(stderr,"\n\n");
//fragment shader compilation
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &Fshader_source, NULL);
glCompileShader(fragmentShader);
//Fragment shader compilation status
GLint Fstatus;
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &Fstatus);
char Fbuffer[512];
glGetShaderInfoLog(fragmentShader, 512, NULL, Fbuffer);
fprintf(stderr,"%s",Fbuffer);
//shader program creation
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram,vertexShader);
glAttachShader(shaderProgram,fragmentShader);
glBindFragDataLocation(shaderProgram,0,"outcolor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
//tell opengl how to interpret and format the vertices data
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glVertexAttribPointer(posAttrib,3, GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(posAttrib );
//vertex post-processing(fixed)
//Primitive assembly(fixed)
//Rasterization(fixed)
//Fragment Processing(fixed)
//per-sample operations(fixed)
}
char error_num = 0;
while(!glfwWindowShouldClose(window)){
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (!error_num){
fprintf(stderr,"%d",glGetError());
error_num++;
}
glDrawArrays(GL_TRIANGLES,0,3);
glfwSwapBuffers(window);
glfwPollEvents();
}
}
- 在
Vshader_source
中:version 330
!=#version 330
。我强烈怀疑你的着色器不是compiling/linking原样。 #version
指令后面需要实际的大写\n
换行符。续行不足。- 使用
GL_COMPILE_STATUS
位做一些事情(比如转储编译日志并退出),而不是盲目地执行程序。 - 在 glLinkProgram() 之后检查
GL_LINK_STATUS
并根据需要转储 link 日志。 - 如果要使用
#version 330
,请在 window 创建时明确请求(通过glfwWindowHint()
与GLFW_CONTEXT_VERSION_MAJOR
和GLFW_CONTEXT_VERSION_MINOR
)3.3 版上下文,现在你只是有点 希望 你会得到 3.3. - 要获得额外的防弹效果,请设置 GLFW error callback。
随意使用来自
对我来说似乎是几个错别字的问题。一、大的:
if(glewInit() != GLEW_OK){
fprintf(stderr,"glew failed to initialize");
return -1;
此错误检查没有右括号。所以你的大部分程序实际上都没有执行,因为它在 inside 这个块中。
你的顶点着色器:
version 330
in vec3 position;
void main()
gl_Position = vec4(position,1.0);
version 330
应该是 #version 330
。 main
应该有牙套。
更正版本:
#version 330
in vec3 position;
void main() {
gl_Position = vec4(position,1.0);
}
正如 genpfault 所提到的,您也没有包含换行符 (\n
)。没关系(如果有点......丑陋)对于大多数事情,但不适用于指令,如#version
。后面需要一个换行符。
将来,您真的应该省去一些麻烦,从文件中加载着色器,而不是将它们作为多行字符串嵌入。说到这里,如果您真的 打算像那样使用多行字符串,请这样做:
const GLchar* Vshader_source =
"#version 330\n"
"in vec3 position;"
"void main() {"
" gl_Position = vec4(position,1.0);"
"}";
预处理器会自动连接仅由空格分隔的常量字符串。比所有那些反斜杠更易于管理!
接下来,
glBindFragDataLocation(shaderProgram,0,"outcolor");
在片段着色器中,您将其称为 outColor
,而不是 outcolor
。案例很重要!
不,我不确定我是否全部抓住了它们,但是...这应该是一个开始?