OpenGL 着色器编译但窗口中未出现渲染

     2023-03-16     34

关键词:

【中文标题】OpenGL 着色器编译但窗口中未出现渲染【英文标题】:OpenGL shaders compile but no rendering appears in the window 【发布时间】:2022-01-24 01:56:21 【问题描述】:

顶点和片段着色器似乎都在编译,窗口出现并被赋予清晰的颜色,但我无法渲染三角形。我试图只使用 glBegin();顶点()​​; glEnd();作为替代方案,但这也导致没有渲染三角形。

ma​​in.c

#include <stdio.h>
#include <unistd.h>
#include <gfx/shader.h>
#include <gfx/vbo.h>
#include <gfx/vao.h>

GLfloat vertices[] = 
    0.0f,1.0f,0.0f,
    1.0f,1.0f,0.0f,
    -1.0f,-1.0f,0.0f
;

int main(void)
    if(!glfwInit())
        fprintf(stderr, "Unable to init GLFW.\n");
        exit(1);
    
    GLFWwindow *win;
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    win = glfwCreateWindow(SCREENWIDTH, SCREENHEIGHT, "Terraria", NULL, NULL);
    if(win==NULL)
        fprintf(stderr, "Error creating opengl window\n");
        glfwTerminate();
        exit(1);
    
    glfwMakeContextCurrent(win);
    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
        fprintf(stderr, "Unable to init glad\n");
        glfwTerminate();
        exit(1);
    
    glViewport(0, 0, 800, 600);
    glfwSetFramebufferSizeCallback(win, frame_buffer_size_cb);

    struct Shader s = create_shader("resources/shaders/vec2.vs", "resources/shaders/vec2.fs");
    uint32_t vaoID, vboID;
    glGenVertexArrays(1, &vaoID);
    glBindVertexArray(vaoID);
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(vboID, 9*sizeof(GLfloat), vertices, GL_STATIC_DRAW);

    while(!glfwWindowShouldClose(win))
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(s.sh);
        glEnableVertexAttribArray(0);
        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glVertexAttribPointer(
            0,
            3,
            GL_FLOAT,
            GL_FALSE,
            3*sizeof(GLfloat),
            (void*)0
        );
        glDrawArrays(GL_TRIANGLES, 0,3);
        glDisableVertexAttribArray(0);


        glfwSwapBuffers(win);
        glfwPollEvents();
    
    glfwTerminate();
    return 0;

shader.h

#include <gfx/gfx.h>

struct Shader
    uint32_t sh;
    uint32_t vsh;
    uint32_t fsh;
;

struct Shader create_shader(const char *vs_path, const char *fs_path);

shader.c

#include <gfx/shader.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>

static uint32_t _compile(int8_t id, const char *path, uint16_t type)
    uint32_t sh; //Shader handle or ID
    FILE *fp = fopen(path, "rb"); //Open the shader source code file
    long sz = file_size(fp); //Get the file size
    char *shaderSource; //Create object to holder shader source code
    shaderSource = calloc(sz+1, 1);
    fread(shaderSource, 1, sz, fp); //Read the shader source code into new buffer
    fclose(fp);
    assert(strlen(shaderSource)>0);
    sh = glCreateShader(type);
    glShaderSource(sh, 1, (const GLchar **)&shaderSource, NULL);
    glCompileShader(sh);
    int success;
    char infoLog[512];
    glGetShaderiv(sh, GL_COMPILE_STATUS, &success);
    if (!success)
    
        glGetShaderInfoLog(sh, 512, NULL, infoLog);
        printf("Unable to compile shader id %d\n", id);
    
    free(shaderSource);
    return sh;


struct Shader create_shader(const char *vs_path, const char *fs_path)
    struct Shader h;
    h.vsh = _compile(1,vs_path, GL_VERTEX_SHADER);
    h.fsh = _compile(0,fs_path, GL_FRAGMENT_SHADER);
    h.sh = glCreateProgram();
    glAttachShader(h.sh, h.vsh);
    glAttachShader(h.sh, h.fsh);
    glLinkProgram(h.sh);
    // check for linking errors
    int success;
    char infoLog[512];
    glGetProgramiv(h.sh, GL_LINK_STATUS, &success);
    if (!success) 
        glGetProgramInfoLog(h.sh, 512, NULL, infoLog);
        printf("Unable to link gl program\n");
    
    glDetachShader(h.sh, h.vsh);
    glDetachShader(h.sh, h.fsh);
    glDeleteShader(h.vsh);
    glDeleteShader(h.fsh);
    return h;

顶点着色器

#version 330 core
layout (location = 0) in vec3 aPos;
void main()
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);

片段着色器

#version 330 core

out vec4 FragColor;

void main()
    FragColor = vec4(1.0,1.0,1.0,1.0);

【问题讨论】:

您已经对着色器编译和链接进行了错误检查,但在主循环中没有任何内容。在主循环中添加一些错误检查。要么你在画黑色,你在向后画,你在相机后面画,或者你忽略了一个错误。 @3Dave 在主循环中检查错误是有意义的。您对如何对主循环中的程序运行错误检查有什么建议吗?我想这不是编译和链接中的着色器错误日志。抱歉,我是 OpenGL 的新手。 glGetError。见khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glGetError.xml 如果你在你的主循环中放了一堆,比如,在每次gl* 调用之后,你会找到错误的来源。那时有点二进制搜索调试。对于无效操作,每个gl* 函数的帮助页面都会列出错误情况。 那个没有错误,把它放在循环中的每个调用之后。关于这个在相机后面的图,我所有的z值都是0.0f,我想只要视口设置正确,它就不会在右边? 【参考方案1】:

我找到了答案。如果您仔细查看 main,似乎您实际上应该将 glBindBuffer 调用到宏 GL_ARRAY_BUFFER 而不是像我想的那样调用 vbo 句柄。解决这个问题会导致我的程序运行。我的窗口提示也没有生效,因为我在创建窗口后调用它们。

【讨论】:

为啥在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?

】为啥在使用OpenGL编译顶点着色器时会出现着色器编译器错误#143、#160和#216?【英文标题】:WhyamIgettingaShaderCompilerError#143,#160and#216whencomilingavertexShaderusingOpenGL?为什么在使用OpenGL编译顶点着色器时会出现着色器编译器错误#143、#16... 查看详情

OpenGL 对象不显示,着色器相关

】OpenGL对象不显示,着色器相关【英文标题】:OpenGlobjectnotdisplaying,shaderrelated【发布时间】:2013-10-2210:40:51【问题描述】:我正在尝试使用着色器在opengl中渲染,生成背景颜色并且没有出现错误消息,但我尝试渲染的对象没有显... 查看详情

OpenGL 着色器无法编译但没有给出错误信息

】OpenGL着色器无法编译但没有给出错误信息【英文标题】:OpenGLshaderdoesnotcompilebutgivesnoerrormessage【发布时间】:2020-12-1017:34:05【问题描述】:我正在尝试编写一个使用OpenGl加载和编译着色器的函数,但着色器拒绝编译,同时给我... 查看详情

为啥不编译opengl着色器?

】为啥不编译opengl着色器?【英文标题】:whyaren\'ttheopenglshaderscompiling?为什么不编译opengl着色器?【发布时间】:2019-12-0219:59:17【问题描述】:我已经安装了OpenGL4.6,并且我正在使用VisualStudio2019。我决定用opengl用C++做一个项目... 查看详情

为啥我可以有 OpenGL 着色器类,但不能有 VAO 类?

】为啥我可以有OpenGL着色器类,但不能有VAO类?【英文标题】:WhycanIhaveanOpenGLshaderclass,butnotaVAOclass?为什么我可以有OpenGL着色器类,但不能有VAO类?【发布时间】:2015-09-0201:22:57【问题描述】:我一直在摆弄制作游戏/渲染引擎,... 查看详情

opengl入门之渲染管线pipeline,着色器shader(代码片段)

图像渲染管线在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(GraphicsPipeline,大多译为管线,实际上指的是一堆原始图形数据途经一... 查看详情

opengl一些概念02

着色器程序着色器程序对象(ShaderProgramObject)是多个着色器合并之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把他们链接为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程... 查看详情

初识opengl链接着色器(代码片段)

1.着色器程序着色器程序对象(ShaderProgramObject)是多个着色器合并之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把它们链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激... 查看详情

opengl渲染管线(renderingpipeline)

    OpenGL中的渲染管线包括:顶点着色器(vertexshader)、细分着色器(里面包含两种:细分控制着色器和细分控制着色器)(tessellationshader)、几何着色器、光栅化及片元着色器(fragmentshader),其中并不是每一次... 查看详情

基于opengl编写一个简易的2d渲染框架-09重构渲染器-shader

  Shader只是进行一些简单的封装,主要功能:    1、编译着色程序    2、绑定Uniform数据    3、根据着色程序的顶点属性传递顶点数据到GPU   着色程序的编译GLuintShader::createShaderProgram(constchar*vsname,constchar*p... 查看详情

opengl着色器语言glsl资料汇编(代码片段)

文章目录1渲染管线中的着色器类型2GLSL和OpenGL的版本对应关系3GLSL语法3.1数据类型3.1.1基本数据类型3.1.2向量3.1.3矩阵3.1.4结构体3.1.5数组3.2操作符和优先级3.3流控制3.3.1循环结构3.3.2分支结构3.4函数4着色器的组成4.1预编译命令4.2全... 查看详情

opengl着色器语言glsl资料汇编(代码片段)

文章目录1渲染管线中的着色器类型2GLSL和OpenGL的版本对应关系3GLSL语法3.1数据类型3.1.1基本数据类型3.1.2向量3.1.3矩阵3.1.4结构体3.1.5数组3.2操作符和优先级3.3流控制3.3.1循环结构3.3.2分支结构3.4函数4着色器的组成4.1预编译命令4.2全... 查看详情

OpenGL - 切换着色器

】OpenGL-切换着色器【英文标题】:OpenGL-switchshaders【发布时间】:2016-09-2818:16:10【问题描述】:我正在努力解决以下问题:我有一个对象,我希望能够使用两组不同的顶点/片段着色器进行渲染,每个着色器都有自己的制服和纹... 查看详情

使用 OpenGL / LibGDX 的后处理问题 - 黑屏(FBO、着色器、四边形)

】使用OpenGL/LibGDX的后处理问题-黑屏(FBO、着色器、四边形)【英文标题】:PostprocessingproblemsusingOpenGL/LibGDX-blackscreen(FBO,shaders,quad)【发布时间】:2014-10-1321:44:43【问题描述】:我在将后处理阶段渲染到屏幕上时遇到了一些问题。... 查看详情

无法从 OpenGL 中的着色器访问先前渲染的纹理

】无法从OpenGL中的着色器访问先前渲染的纹理【英文标题】:CannotaccesspreviouslyrenderedtexturefromshaderinOpenGL【发布时间】:2011-08-2322:55:33【问题描述】:我有一个OpenGL程序,我在其中做一些增强现实工作。它分2次运行。首先,它使... 查看详情

为啥精灵不在 OpenGL 中渲染?

】为啥精灵不在OpenGL中渲染?【英文标题】:WhyisthespritenotrenderinginOpenGL?为什么精灵不在OpenGL中渲染?【发布时间】:2018-04-0412:45:18【问题描述】:我正在尝试在OpenGL中渲染2D(屏幕协调)精灵。然而,当我编译它时,它并没有... 查看详情

初识opengl链接着色器(代码片段)

1.着色器程序着色器程序对象(ShaderProgramObject)是多个着色器合并之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把它们链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激... 查看详情

Opengl 未使用着色器正确绘制 - 矩阵设置/初始化问题?

】Opengl未使用着色器正确绘制-矩阵设置/初始化问题?【英文标题】:Openglnotdrawingcorrectlyusingshader-issuewithmatrixsetup/initialization?【发布时间】:2015-05-1115:58:34【问题描述】:当我渲染我的应用程序时,我希望在窗口边缘看到一些矩... 查看详情