【问题标题】:glpointsize() Fails to Shrink a Pointglpointsize() 缩小点失败
【发布时间】:2020-05-22 01:50:07
【问题描述】:

我正在尝试编写一个简单的 opengl 程序,该程序使用glPointSize() 和变量pointSize 在屏幕中心循环增长和缩小一个点。打印pointSize 的值并使用调试器单步执行代码似乎表明pointSize 在每次迭代中都正确更新。当pointSize 增加时,该点的渲染似乎也是正确的,但是当pointSize 减少时,该点仍以其最大尺寸在屏幕上渲染,并且无论pointSize 增长多少,都保持这种渲染方式或价值缩水 - 我不知道为什么。

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <iostream>

#define numVAOs 1
GLuint renderingProgram;
GLuint vao[numVAOs];

GLuint createShaderProgram() {
    const char *vshaderSource =
        "#version 430    \n"
        "void main(void) \n"
        "{ gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";

    const char *fshaderSource =
        "#version 430    \n"
        "out vec4 color; \n"
        "void main(void) \n"
        "{ color = vec4(0.0, 0.0, 1.0, 1.0); }";

    GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint vfprogram = glCreateProgram();

    glShaderSource(vShader, 1, &vshaderSource, NULL);
    glShaderSource(fShader, 1, &fshaderSource, NULL);

    glCompileShader(vShader);
    glCompileShader(fShader);

    glAttachShader(vfprogram, vShader);
    glAttachShader(vfprogram, fShader);

    glLinkProgram(vfprogram);

    return vfprogram;
}

void init() {
    renderingProgram = createShaderProgram();
    glGenVertexArrays(numVAOs, vao);
    glBindVertexArray(vao[0]);
}

GLfloat pointSize = 100.0f;
GLfloat increment = 1.0f;

void display() {
    glUseProgram(renderingProgram);

    if (pointSize > 200 || pointSize < 2) increment *= -1.0f;
    pointSize += increment;

    glPointSize(pointSize);
    glDrawArrays(GL_POINTS, 0, 1);
}

int main(void) {
    if (!glfwInit()) exit(EXIT_FAILURE);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

    GLFWwindow* window = glfwCreateWindow(600, 600, "Test", nullptr, nullptr);

    glfwMakeContextCurrent(window);

    if (glewInit() != GLEW_OK) exit(EXIT_FAILURE);

    glfwSwapInterval(1);

    init();

    while (!glfwWindowShouldClose(window)) {
        display();
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

【问题讨论】:

    标签: c++ opengl glfw glew opengl-4


    【解决方案1】:

    您的代码没有使用glClear 清除屏幕。因此,当点增长时,您可以看到它。当它缩小时,它只是在较大的点“内部”绘制,而您不会注意到它。如果您在更改大小时更改点的颜色,您可能会发现它。

    只需清除帧开头的颜色缓冲区:

    void display() {
        // default clear color is black, but you can change it:
        //glClearColor(1,0,0,1);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glUseProgram(renderingProgram);
        ...
    

    【讨论】:

    • 完美!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2021-03-29
    • 2017-01-17
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多