Точечные спрайты OpenGL отображаются как точки, а не как текстуры

0

Здесь мой код

вершинный шейдер

#version 430

in vec3 position;
uniform mat4 MVP;

void main()
{
    gl_Position = MVP * vec4(position, 1.0);
}

фрагментарный шейдер

#version 430

out vec4 outputColor;
uniform sampler2D tex;

void main()
{
    outputColor = texture(tex, gl_PointCoord);
}

в этом

void init()
{
    glPointSize(20.0f);
    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    bmp.Open("C:\\users\\alon\\desktop\\star.bmp");
    bmp.ReadPixels();
    unsigned char *pixels = new unsigned char[bmp.NeededBufferSize()];
    bmp.AssignPixels(pixels);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, bmp.GetWidth(), bmp.GetHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
    delete[] pixels;

    glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    GLuint VaoId;
    glGenVertexArrays(1, &VaoId);
    glBindVertexArray(VaoId);

    position_index = glGetAttribLocation(program, "position");
    MVP_location = glGetUniformLocation(program, "MVP");

    //                      x      y      z     s     t
    GLfloat vertices[] = {-0.5f, -0.5f, 0.0f,
                           0.5f, -0.5f, 0.0f,
                           0.5f,  0.5f, 0.0f,
                           0.5f,  0.5f, 0.0f,
                          -0.5f,  0.5f, 0.0f,
                          -0.5f, -0.5f, 0.0f};

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(position_index, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

оказывать

void render()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnableVertexAttribArray(position_index);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    float c;
    if(bTime)
        c = (float)std::clock() * 2.0f / CLOCKS_PER_SEC;
    else
        c = 0.0f;

    glm::mat4 modelview = glm::rotate(-c * 50.0f, glm::vec3(0.0f, 1.0f, 0.0f));
    modelview = glm::translate(glm::vec3(0.0f + fTranslateX, 0.0f, -1.75f + fTranslateZ)) * modelview;
    glm::mat4 projection = glm::perspective(60.0f, 16.0f/9.0f, 0.10f, 100.0f); //perspective
    glm::mat4 MVP = projection * modelview;

    glUniformMatrix4fv(MVP_location, 1, GL_FALSE, &MVP[0][0]);

    glDrawArrays(GL_POINTS, 0, 6);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(position_index);

    glutSwapBuffers();

    if(glGetError() != GL_NO_ERROR)
        exit(1);
}

Звездное изображение:

Изображение 174551

Вывод:

Изображение 174551

Есть ли что-то, что я делаю неправильно?

  • 0
    Я просто отключил мультисэмплинг, и теперь точки являются квадратными, но все еще не отображают текстуру.
  • 0
    vec2 (0.5, 0.5) то меняется, если вы используете vec2 (0.5, 0.5) вместо gl_PointCoord ? (это должно привести к появлению белого спрайта) . Я думаю, что ваша текстура загружена неправильно. Альфа-канал неявно равен 1,0 в текстуре RGB, а все остальное изначально равно 0,0 , что объясняет то, что вы видите.
Показать ещё 5 комментариев
Теги:
opengl
image
textures

1 ответ

2

В профилях совместимости (или любой версии GL до 3.1) поведение, которое вы хотите, происходит только тогда, когда включен GL_POINT_SPRITE. В основном профиле это состояние было удалено, и gl_PointCoord всегда ведет себя так, как если GL_POINT_SPRITE были включены GL_POINT_SPRITE.

Чтобы устранить проблему, вы должны вызвать glEnable (GL_POINT_SPRITE).

  • 0
    Так, по-видимому, я кодирую в старой версии OpenGL? Как начать кодирование в «профиле ядра»?
  • 0
    Вы можете запросить основной профиль у FreeGLUT ( glutInitContextVersion (4,3); glutInitContextProfile (GLUT_CORE_PROFILE); ), но многое из-за этого сломается. Ваш код должен быть на 100% современным, или он не будет работать, если вы перейдете от совместимости (по умолчанию) к ядру.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню