Qt OpenGLWindow не рендеринг треугольника - PullRequest
0 голосов
/ 27 февраля 2019

Используя Qt5 (5.12) и OpenGL 4.3, приведенный ниже код не будет рисовать прямоугольник, который я хочу.

компилируется нормально, но просто показывает черный фон (цвет меняется, когда я меняю значение, поэтому, по крайней мере,что-то работает), но не показывает треугольник

Пример взят из первых глав синей книги OpenGL.Так как это единственный ресурс, который у меня есть и которому я могу с комфортом следовать, я хотел бы писать код напрямую с помощью функций opengl и избегать использования классов Qt на этом этапе, если это возможно.

 > glxinfo
   OpenGL core profile version string: 4.6.0 NVIDIA 390.77
   OpenGL core profile shading language version string: 4.60 NVIDIA
   OpenGL core profile context flags: (none)
   OpenGL core profile profile mask: core profile
   OpenGL core profile extensions:
   OpenGL version string: 4.6.0 NVIDIA 390.77
   OpenGL shading language version string: 4.60 NVIDIA

Обратите внимание, что окно инициализируется с помощью OpenGL, CoreProfile,4,3 формат

 class Window : public QOpenGLWindow, protected QOpenGLFunctions_4_3_Core
 {
    Q_OBJECT
    ...

    // QOpenGLWindow interface
    protected:
    void initializeGL() override;
    void resizeGL(int w, int h) override;
    void paintGL() override;

     GLuint rendering_program;
     GLuint vertex_array_object;
  }



initializeGL() ----------------
{
    /**** COMPILE SHADERS ****/

    GLuint vertex_shader, fragment_shader, program;

    static const GLchar *vertex_shader_source[] = {
    "#version 430 core                              \n",
    "                                               \n",
    "void main(void)                                \n",
    "{                                              \n",
    "   const vec4 vertices[3] = vec4[3](           \n",
    "       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",
    "                                               \n",
    "   gl_Position = vertices[gl_VertexID];        \n",
    "}                                              \n",
    };


     static const GLchar *fragment_shader_source[] = {
        "#version 430 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 compile vertex shader
      vertex_shader = glCreateShader(GL_VERTEX_SHADER);
      glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
      glCompileShader(vertex_shader);

      // create and compile fragment shader
     fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
     glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
     glCompileShader(fragment_shader);

     // crate a program, attach shaders to it
     program = glCreateProgram();
     glAttachShader(program, vertex_shader);
     glAttachShader(program, fragment_shader);
     glLinkProgram(program);

     glDeleteShader(vertex_shader);
     glDeleteShader(fragment_shader);

     rendering_program = program;

      glGenVertexArrays(1, &vertex_array_object);
      glBindVertexArray(vertex_array_object);
  }


 paintGL() --------------------------
 {
     const GLfloat color[] = { 0.0f, 0.0f, 0.0f, 1.0f };
     glClearBufferfv(GL_COLOR, 0, color);

     glUseProgram(rendering_program);
     glBindVertexArray(vertex_array_object);



     glDrawArrays(GL_TRIANGLES, 0, 3);
     glFlush();
  }

1 Ответ

0 голосов
/ 27 февраля 2019

Это было трудно увидеть.

Объявление vertex_shader_source

 static const GLchar *vertex_shader_source[] = {
     "#version 430 core                              \n",
     "                                               \n",
     "void main(void)                                \n",
     "{                                              \n",
     "   const vec4 vertices[3] = vec4[3](           \n",
     "       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",
     "                                               \n",
     "   gl_Position = vertices[gl_VertexID];        \n",
     "}                                              \n",
 };

и fragment_shader_source

 static const GLchar *fragment_shader_source[] = {
     "#version 430 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",
 };

относится не к типу const char*, а к const char*[].vertex_shader имеет 11 элементов, а fragment_shader_source имеет 8 элементов.

2-й параметр glShaderSource должен быть числом элементов в массиве.
должно быть:

glShaderSource(vertex_shader, 11, vertex_shader_source, NULL);

соответственно

glShaderSource(fragment_shader, 8, fragment_shader_source, NULL);

Я рекомендую использовать Необработанный строковый литерал вместо массивов:

const char *vertex_shader_source = R"(
#version 430 core                      

void main(void)                        
{                                      
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));  

gl_Position = vertices[gl_VertexID];                                     
}
)";


const char *fragment_shader_source = R"(
#version 430 core                   

out vec4 color;                     

void main(void)                     
{                                   
color = vec4(0.0, 0.8, 1.0, 1.0);
}                                   
)";
glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);

Далее, проверьте успешность компиляции шейдеров:

например,

GLint status;

glCompileShader(vertex_shader);
glGetShaderiv( vertex_shader, GL_COMPILE_STATUS, &status );
if ( status == GL_FALSE )
{
    GLint logLen;
    glGetShaderiv( vertex_shader, GL_INFO_LOG_LENGTH, &logLen );
    std::vector< char >log( logLen );
    GLsizei written;
    glGetShaderInfoLog( vertex_shader, logLen, &written, log.data() );
    std::cout << "compile error:" << std::endl << log.data() << std::endl;
}

и успешное ли связывание программы:

например

glLinkProgram(program);
glGetProgramiv( program, GL_LINK_STATUS, &status );
if ( status == GL_FALSE )
{
    GLint logLen;
    glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logLen );
    std::vector< char >log( logLen );
    GLsizei written;
    glGetProgramInfoLog( program, logLen, &written, log.data() );
    std::cout  << "link error:" << std::endl << log.data() << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...