绘制三角形的OpenGL程序给出了一个黄色的屏幕

Posted

技术标签:

【中文标题】绘制三角形的OpenGL程序给出了一个黄色的屏幕【英文标题】:OpenGL program to draw a triangle gives a yellow screen 【发布时间】:2018-07-12 14:07:28 【问题描述】:

我正在尝试用 OpenGL 绘制一个三角形。

我的代码编译得很好,没有产生任何错误,但它仍然没有做它应该做的。

我有一个顶点着色器和一个片段着色器,它们都在同一个程序中。

我的代码如下:

#include "../../include/sb7.h"

GLuint compile_shaders(void)

    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;

    // Source code for Vertex Shader
    static const GLchar * vertex_shader_source[] =
    
        "#version 450 core                                                  \n"
        "                                                                   \n"
        "void main(void)                                                    \n"
        "                                                                  \n"
        "   //Decalre a hardcoded array of positions                        \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"
        "   //Index into our array using gl_VertexID                        \n"
        "   gl_Position = vertices[gl_VertexID];                            \n"
        "                                                                  \n"
    ;

    // Source code for Fragment Shader
    static const GLchar * fragment_shader_source[] =
    
        "#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 compiler Vertex Shader
    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
    glCompileShader(vertex_shader);

    // Create and compiler Fragment Shader
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
    glCompileShader(fragment_shader);

    // Create program, attach shaders to it, and link it
    program = glCreateProgram();
    glAttachShader(program, vertex_shader);
    glAttachShader(program, fragment_shader);
    glLinkProgram(program);

    // Delete shaders as program has them now
    glDeleteShader(vertex_shader);
    glDeleteShader(fragment_shader);

    return program;
;

class my_application : public sb7::application

public:

    void startup()
    
        rendering_program = compile_shaders();
        glCreateVertexArrays(1, &vertex_array_object);
        glBindVertexArray(vertex_array_object);
    

    void shutdown()
    
        glDeleteVertexArrays(1, &vertex_array_object);
        glDeleteProgram(rendering_program);
        glDeleteVertexArrays(1, &vertex_array_object);
    

    // Our rendering function
    void render(double currentTime)
    
        // Sets Colour
        static const GLfloat color[] =  0.0f, 0.2f, 0.0f, 1.0f ;
        glClearBufferfv(GL_COLOR, 0, color);

        // Use program object we created for rendering
        glUseProgram(rendering_program);

        // Draw one triangle
        glDrawArrays(GL_TRIANGLES, 0, 3);
    

private:

    GLuint rendering_program;
    GLuint vertex_array_object;
; 

我正在关注 OpenGL Superbible,第 7 版。

即使我更改了点的大小并且输出是我为此获得的相同屏幕(全黄色),相同的程序(有小的更改)也没有绘制点。

我看到在绘制三角形过程中出现类似的问题,但它们都与我正在做的不同。

我该如何解决这个问题?

【问题讨论】:

我看不到你在哪里覆盖init(),它调用了所需的sb7::application::init() 这本书没有说要覆盖sb7::application's init().,只是说要覆盖render(), startup(), and shutdown() 我在看SB7dir\scr\singletri,这似乎是你的基地。它覆盖init(),以便能够设置一些细节。请参阅SB7dir\include\sb7.h 在您的情况下,此函数正在设置 4.3 上下文,而您在着色器中要求 4.5。 GLSL 编译和链接日志说了什么? (看这里how glsl_log is obtained)我敢打赌,你的着色器源代码文本没有像应该的那样编码为 ASCII ......如果有影响,请尝试使用文件。如果是,则需要添加某种_TEXT("bla bla bla") 宏来补偿。 我现在也改成了4.3的上下文,但它只是显示一个黄屏 【参考方案1】:

在这里工作得很好:

大家一起:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cstdarg>
#include <cstdlib>

struct Program

    static GLuint Load( const char* shader, ... )
    
        GLuint prog = glCreateProgram();
        va_list args;
        va_start( args, shader );
        while( shader )
        
            const GLenum type = va_arg( args, GLenum );
            AttachShader( prog, type, shader );
            shader = va_arg( args, const char* );
        
        va_end( args );
        glLinkProgram( prog );
        CheckStatus( prog );
        return prog;
    

private:
    static void CheckStatus( GLuint obj )
    
        GLint status = GL_FALSE;
        if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
        if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
        if( status == GL_TRUE ) return;
        GLchar log[ 1 << 15 ] =  0 ;
        if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
        if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
        std::cerr << log << std::endl;
        exit( EXIT_FAILURE );
    

    static void AttachShader( GLuint program, GLenum type, const char* src )
    
        GLuint shader = glCreateShader( type );
        glShaderSource( shader, 1, &src, NULL );
        glCompileShader( shader );
        CheckStatus( shader );
        glAttachShader( program, shader );
        glDeleteShader( shader );
    
;

const char* vert = R"GLSL(
#version 450 core                                                
void main(void)                                                  
                                                                
    //Decalre a hardcoded array of positions                      
    const vec4 vertices[3] = vec4[3]
        (
        vec4(0.25, -0.25, 0.5, 1.0), 
        vec4(-0.25, -0.25, 0.5, 1.0),
        vec4(0.25, 0.25, 0.5, 1.0)
        );
    //Index into our array using gl_VertexID                      
    gl_Position = vertices[gl_VertexID];                          
                                                                
)GLSL";

const char* frag = R"GLSL(
#version 450 core                           
out vec4 color;                             
void main(void)                             
                                           
    color = vec4(0.0, 0.8, 1.0, 1.0);        
                                           
)GLSL";

int main( int argc, char** argv )

    glfwInit();

    glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
    glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 5 );
    glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
    glfwWindowHint( GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE );
    GLFWwindow* window = glfwCreateWindow( 640, 480, "51307782", NULL, NULL );
    glfwMakeContextCurrent( window );
    glewInit();
    glfwSwapInterval( 1 );

    GLuint rendering_program = Program::Load
        (
        vert, GL_VERTEX_SHADER,
        frag, GL_FRAGMENT_SHADER,
        NULL
        );

    GLuint vertex_array_object = 0;
    glCreateVertexArrays( 1, &vertex_array_object );
    glBindVertexArray( vertex_array_object );

    while( !glfwWindowShouldClose( window ) )
    
        glfwPollEvents();

        static const GLfloat color[] =  0.0f, 0.2f, 0.0f, 1.0f ;
        glClearBufferfv( GL_COLOR, 0, color );
        glUseProgram( rendering_program );
        glDrawArrays( GL_TRIANGLES, 0, 3 );

        glfwSwapBuffers( window );
    

    glDeleteVertexArrays( 1, &vertex_array_object );
    glDeleteProgram( rendering_program );

    glfwDestroyWindow( window );
    glfwTerminate();

【讨论】:

我看到你的着色器和我的一样,这意味着如果它适用于你,那么它也应该适用于我,除非它不适合我。您是否对我的代码进行了任何更改/添加? 和你一样,我使用const char* 而不是static const GLchar * 用于顶点和片段着色器。然后我传递了一个引用&amp;vert, &amp;frag 作为glShaderSource 函数的第三个参数。但是,这并没有改变任何东西,输出仍然是黄屏

以上是关于绘制三角形的OpenGL程序给出了一个黄色的屏幕的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL程序给出一个段错误

编程题目:利用Opengl绘制一个三角形。

OpenGL几何着色器三角形不会没有错误地绘制

OpenGL:绘制多边形时,如果第一个顶点在屏幕空间之外怎么办(三角扇)

opengl绘制三角形

OpenGL绘制三角形而不是正方形