程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了GL_POINTS 和 GL_LINES 的 OpenGL glDrawArrays 在相同点的不同像素上大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决GL_POINTS 和 GL_LInes 的 OpenGL glDrawArrays 在相同点的不同像素上?

开发过程中遇到GL_POINTS 和 GL_LInes 的 OpenGL glDrawArrays 在相同点的不同像素上的问题如何解决?下面主要结合日常开发的经验,给出你关于GL_POINTS 和 GL_LInes 的 OpenGL glDrawArrays 在相同点的不同像素上的解决方法建议,希望对你解决GL_POINTS 和 GL_LInes 的 OpenGL glDrawArrays 在相同点的不同像素上有所启发或帮助;

使用归一化的 [-1,1] 点 A = (0.5,0.5)B = (0.5,-0.5)C = (-0.5,-0.5)D = (-0.5,0.5),我将这些点绘制为带有 {{1 }}。我发现当我还调用 glDrawArrays(GL_POINTS,4) 来绘制 2 条线 glDrawArrays(GL_lines,4)AB 时,2 条线的点和端点之间在 x 方向上有 1 个像素的差异。这是我所看到的截图:

GL_POINTS 和 GL_LINES 的 OpenGL glDrawArrays 在相同点的不同像素上

如果我将窗口大小从 800x600 更改为 850x600,我也可以解决这个问题。我认为这可能与奇数或偶数大小的窗口宽度有关,但我不确定。在我的代码中,您可以注释掉 CD 以更改不会出现问题的窗口大小。任何想法将不胜感激!

这是我的完整代码供参

#define SHOW_PROBLEM

这也可能有用:

#include <bits/stdc++.h>
#include <glad/glad.h>
#include <GLFW/glfw3.h>

voID framebuffer_size_callBACk(GLFWwindow * window,int wIDth,int height);
voID processinput(GLFWwindow * window);

#define SHOW_PROBLEM
#ifdef SHOW_PROBLEM

// these dimensions show the problem
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600

#else

// these dimensions DO NOT show the problem
#define WINDOW_WIDTH 850
#define WINDOW_HEIGHT 600

#endif

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_COntexT_VERSION_MAJOR,3);
    glfwWindowHint(GLFW_COntexT_VERSION_MInor,3);
    glfwWindowHint(GLFW_OPENGL_PROfile,GLFW_OPENGL_CORE_PROfilE);

    GLFWwindow * window = glfwCreateWindow(WINDOW_WIDTH,WINDOW_HEIGHT,"OpenGLDemo",nullptr,nullptr);

    if (!window)
    {
        std::cout << std::unitbuf
                  << "[ERROR] " << __file__ << ':' << __liNE__ << ' ' << __PRETTY_FUNCTION__
                  << "\n[ERROR] " << "Failed to create GLFW window!"
                  << std::nounitbuf << std::endl;
        glfwTerminate();
        std::abort();
    }

    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallBACk(window,framebuffer_size_callBACk);

    if (!gladLoadGLLoader(reinterpret_cast<GLADloadproc>(glfwGetProcAddress)))
    {
        std::cout << std::unitbuf
                  << "[ERROR] " << __file__ << ':' << __liNE__ << ' ' << __PRETTY_FUNCTION__
                  << "\n[ERROR] " << "Failed to initialize GLAD!"
                  << std::nounitbuf << std::endl;

        std::abort();
    }

    // vertex shader
    const char * vertexShadersource = "#version 330 core\n"
                                      "layout (LOCATIOn = 0) in vec3 aPos;\n"
                                      "voID main()\n"
                                      "{\n"
                                      " gl_position = vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
                                      "}\0";

    unsigned int vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShadersource(vertexShader,1,&vertexShadersource,nullptr);
    glCompileShader(vertexShader);

    int success;
    char infolog[512];
    glGetShaderiv(vertexShader,GL_COMPILE_STATUS,&success);

    if (!success)
    {
        glGetShaderInfolog(vertexShader,512,infolog);

        std::cout << std::unitbuf
                  << "[ERROR] " << __file__ << ':' << __liNE__ << ' ' << __PRETTY_FUNCTION__
                  << "\n[ERROR] " << "Vertex shader compilation Failed!"
                  << "\n[ERROR] " << infolog
                  << std::nounitbuf << std::endl;

        std::abort();
    }

    // fragment shader
    const char * fragmentShadersource = "#version 330 core\n"
                                        "out vec4 Fragcolor;\n"
                                        "voID main()\n"
                                        "{\n"
                                        "    Fragcolor = vec4(1.0f,0.5f,0.2f,1.0f);\n"
                                        "}\0";

    unsigned int fragmentShader;
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShadersource(fragmentShader,&fragmentShadersource,nullptr);
    glCompileShader(fragmentShader);
    glGetShaderiv(vertexShader,infolog);

        std::cout << std::unitbuf
                  << "[ERROR] " << __file__ << ':' << __liNE__ << ' ' << __PRETTY_FUNCTION__
                  << "\n[ERROR] " << "Fragment shader compilation Failed!"
                  << "\n[ERROR] " << infolog
                  << std::nounitbuf << std::endl;

        std::abort();
    }

    unsigned int shaderProgram;
    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram,vertexShader);
    glAttachShader(shaderProgram,fragmentShader);
    gllinkProgram(shaderProgram);
    glGetProgramiv(shaderProgram,GL_link_STATUS,&success);

    if (!success)
    {
        glGetProgramInfolog(shaderProgram,infolog);

        std::cout << std::unitbuf
                  << "[ERROR] " << __file__ << ':' << __liNE__ << ' ' << __PRETTY_FUNCTION__
                  << "\n[ERROR] " << "Shader program linking Failed!"
                  << "\n[ERROR] " << infolog
                  << std::nounitbuf << std::endl;

        std::abort();
    }

    gldeleteShader(vertexShader);
    gldeleteShader(fragmentShader);

    float vertices[] = {
            0.5f,0.0f,// top right
            0.5f,-0.5f,// bottom right
            -0.5f,// bottom left
            -0.5f,0.0f    // top left
    };


    unsigned int VAO;
    glGenVertexArrays(1,&VAO);
    glBindVertexArray(VAO);

    unsigned int VBO;
    glGenBuffers(1,&VBO);

    glBindBuffer(GL_ARRAY_BUFFER,VBO);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

    glVertexAttribPointer(0,3,GL_float,GL_falSE,3 * sizeof(float),reinterpret_cast<void *>(0));
    glEnabLevertexAttribarray(0);

    // 6. render loop

    glVIEwport(0,WINDOW_WIDTH,WINDOW_HEIGHT);

    while (!glfwwindowshouldClose(window))
    {
        processinput(window);

        // BACkground
        glClearcolor(0.2f,0.3f,1.0f);
        glClear(GL_color_BUFFER_BIT);

        gluseProgram(shaderProgram);

        glDrawArrays(GL_POINTS,4);
        glDrawArrays(GL_lines,4);

        // check and call events and swap the buffers
        glfwPollEvents();
        glfwSwapBuffers(window);
    }

    // de-allocate all resources once they've outlived their purpose:
    gldeleteVertexArrays(1,&VAO);
    gldeleteBuffers(1,&VBO);
    gldeleteProgram(shaderProgram);

    glfwTerminate();
    return 0;
}


voID framebuffer_size_callBACk(GLFWwindow * window,int height)
{
    glVIEwport(0,wIDth,height);
}


voID processinput(GLFWwindow * window)
{
    if (glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)
    {
        glfwSetwindowshouldClose(window,truE);
    }
}

解决方法

对于 GL_LInes,光栅化器必须在两个顶点之间进行插值,并且对于从顶点到片段着色器的任何其他内插值,您不应依赖于硬编码值和内插值之间的某种相等性。窗口的大小调整告诉您差异只是由于这种插值/浮动错误。如果您的目标是为顶点着色,请尝试在着色器中添加逻辑以检查当前像素片段是否非常接近它所插值的 2 个顶点并相应地着色。

大佬总结

以上是大佬教程为你收集整理的GL_POINTS 和 GL_LINES 的 OpenGL glDrawArrays 在相同点的不同像素上全部内容,希望文章能够帮你解决GL_POINTS 和 GL_LINES 的 OpenGL glDrawArrays 在相同点的不同像素上所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: