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_MAJORGLFW_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 330main 应该有牙套。 更正版本:

#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。案例很重要!

不,我不确定我是否全部抓住了它们,但是...这应该是一个开始?