OpenGL glfw 无法使用着色器绘制点

Posted

技术标签:

【中文标题】OpenGL glfw 无法使用着色器绘制点【英文标题】:OpenGL glfw unable to draw a point using shader 【发布时间】:2020-10-10 12:42:33 【问题描述】:

我使用GLFW 来创建窗口上下文。

我有一个 procs.hpp 文件,它只使用 glxGetProcAddress 加载所需的 opengl 函数(如 glCreateShaderglCreateProgram 等)。

程序编译成功,但是当我运行它时屏幕上没有任何意义。只是粉红色的背景。

谁能指出错误?

#include <GLFW/glfw3.h>
#include <iostream>
#include <GL/glx.h>
#include <stdio.h>
#include "procs.hpp"

constexpr const GLchar * vertex_shader_source = 
R"(#version 450 core

    void main()
        gl_Position = vec4(0.3, 0.3, 0.5, 1.0);
    

)";

int a= printf("%s",vertex_shader_source);

constexpr const GLchar * fragment_shader_source = 
R"(#version 450 core
    out vec4 out_color;
    void main()
        out_color= vec4(1,0,0,1);
    
)"; 

int main()

    GLFWwindow* window;
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;
    GLuint vertex_array_object;

    /* Initialize the library */
    if (!glfwInit())
    std::cerr<<"Error initializing glfw";   
        return -1;
    

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(1000, 800, "Hello World", NULL, NULL);
    if (!window)
    
        glfwTerminate();
        return -1;
    

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    vertex_shader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shader, 1, &vertex_shader_source, nullptr);
    glCompileShader(vertex_shader);
    
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER) ;
    glShaderSource(fragment_shader,1,&fragment_shader_source,nullptr);
    glCompileShader(fragment_shader);

    program = glCreateProgram();
    glAttachShader(program,vertex_shader);
    glAttachShader(program,fragment_shader);
    glLinkProgram(program);

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

    glCreateVertexArrays(1, &vertex_array_object);
    glBindVertexArray(vertex_array_object);

    glClearColor(1,0,1,1);
    glPointSize(10.0f);
    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
       
        /* Render here */
        
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(program);
        glDrawArrays(GL_POINTS, 0, 1);
       
        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    

    glDeleteProgram(program);

    glfwTerminate();
    return 0;


【问题讨论】:

glPointSize 在核心配置文件中无效。您必须使用兼容性配置文件。 @Rabbid76,在核心配置文件中是否可以替代glPointSize() 不行,你必须用三角形图元绘制圆形或矩形。 【参考方案1】:

OpenGL Context 不保证提供 10.0 的磅值 (glPointSize)。 通过检索参数GL_POINT_SIZE_RANGE获取点大小范围:

GLfloat pointSizeRange[2];
glGetFloatv(GL_POINT_SIZE_RANGE, pointSizeRange);

【讨论】:

谢谢!我尝试了兼容性配置文件,它按预期工作。到目前为止,我没有使用 glew 或很高兴保持简单并了解它在没有库的情况下如何工作。 glxGetProcAdress() 现在就足够了。我可以知道您从哪里发现glPointSize() 在核心配置文件中不起作用?你能提供来源还是你凭经验知道的? :) @Omkar76 来自OpenGL specification - Khronos OpenGL registry,比较OpenGL 4.6 API Core Profile Specification 和OpenGL 4.6 API Compatibility Profile Specification

以上是关于OpenGL glfw 无法使用着色器绘制点的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL代码适用于GLFW,但不适用于Qt OpenGL

OpenGL glfw无法绘制点数

OpenGL着色器不绘制[关闭]

opengl 几何着色器

用于在大满贯中绘制特征点的opengl着色器[关闭]

Emscripten 无法编译着色器