c - Opengl 什么也没画,只是告诉我没有错误

标签 c opengl opengl-3

当我运行程序时,窗口是黑色的。我一直在使用这个教程 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();
        }
}

最佳答案

对我来说似乎是几个错别字的问题。首先,大的:

if(glewInit() != GLEW_OK){
    fprintf(stderr,"glew failed to initialize");
    return -1;

此错误检查没有右括号。所以你的大部分程序实际上都没有执行,因为它在这个 block 中内部

你的顶点着色器:

version 330
in vec3 position;
void main()
  gl_Position = vec4(position,1.0);

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

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

关于c - Opengl 什么也没画,只是告诉我没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43883063/

相关文章:

c++ - openGL/GLSL : bloom/blur, 渲染到 FBO

c++ - 在 OpenGL 中使用纹理图集作为纹理数组

opengl - 程序管线着色器变量交换

android - For IOS 中的 C++ 网络库

sql - C语言如何实现Left Outer Join

c++ - 将 GL_TRIANGLE_STRIP 显示为线框

casting - 我的 GLSL 隐式转换错误位于哪里?

c - 我不知道如何循环这段代码。每次我使用 while 它只是重复第一个 printf 句子

c++ - OpenGl:Arcball相机旋转问题

c++ - 我会因单例过度而感到过度杀伤力吗?