OpenGL - текстурированный квадратор обрезан и странно растянут - PullRequest
2 голосов
/ 27 сентября 2019

В настоящее время я создаю некоторые пиксельные данные на своем компьютере и отправляю их в текстуру в OpenGL.Экспортированный буфер, в который я пишу, безупречен, но тот же буфер, что и текстура на квадре, странно искажен.Я исправил UV, проверил настройки текстуры, но все, кажется, в порядке.

Предварительный просмотр OpenGL находится на правой стороне.С левой стороны находится предварительный просмотр необработанных буферных данных, хранящихся в виде компонентов RGB (для предварительного просмотра я использовал rawpixels.net).Это те же данные, которые я отправляю в текстуру.Preview

int width = 400;
int height = 300;

int main() {
    glfwInit();
    glewInit();

    GLFWwindow* win = glfwCreateWindow(width, height, "", NULL, NULL);
    glfwMakeContextCurrent(win);
    glfwSetWindowAttrib(win, GLFW_RESIZABLE, 0);

    unsigned int tex;
    rgb* canvas = new rgb[width * height];

    graphics g(width, height, canvas);
    g.drawLine(vec2(0, 0), vec2(100, 300), 10, rgb(100, 100, 255));

    float x1 = 255.0 / width;
    float x2 = 255.0 / height;

    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            g.pixel(i, j, rgb(i * x1, j * x1, 255));
        }
    }

    g.drawLine(vec2(0, 0), vec2(100, 300), 10, rgb(255, 50, 20));

    g.saveBuffer("./res/frame.raw");

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_RECTANGLE, tex);
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, canvas);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);

    glEnable(GL_TEXTURE_RECTANGLE);

    while (!glfwWindowShouldClose(win)) {
        glfwPollEvents();

        glBegin(GL_QUADS);

        glTexCoord2i(0, 0);
        glVertex2i(-1, 1);

        glTexCoord2i(0, width);
        glVertex2i(-1, -1);

        glTexCoord2i(height, width);
        glVertex2i(1, -1);

        glTexCoord2i(height,0 );
        glVertex2i(1, 1);

        glEnd();

        glfwSwapBuffers(win);
    }

    glDeleteTextures(1, &tex);

    return 0;
}

rgb - это просто структура, содержащая компоненты R, G и B, которые хранятся как байты без знака.Графика - это объект класса, который я создал.Он содержит несколько методов, которые записывают данные на холст.

1 Ответ

3 голосов
/ 27 сентября 2019

У вас проблема с glTexCoord2i - x и y поменялись местами

        glTexCoord2i(height, width); // must be glTexCoord2i(width, height)
        //           ^=======^

Здесь исправлена ​​одна ошибка:

int width = 400;
int height = 300;

int main() {
    glfwInit();
    glewInit();

    GLFWwindow* win = glfwCreateWindow(width, height, "", NULL, NULL);
    glfwMakeContextCurrent(win);
    glfwSetWindowAttrib(win, GLFW_RESIZABLE, 0);

    unsigned int tex;
    rgb* canvas = new rgb[width * height];

    graphics g(width, height, canvas);
    g.drawLine(vec2(0, 0), vec2(100, 300), 10, rgb(100, 100, 255));

    float x1 = 255.0 / width;
    float x2 = 255.0 / height;

    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            g.pixel(i, j, rgb(i * x1, j * x1, 255));
        }
    }

    g.drawLine(vec2(0, 0), vec2(100, 300), 10, rgb(255, 50, 20));

    g.saveBuffer("./res/frame.raw");

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_RECTANGLE, tex);
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, canvas);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, GL_CLAMP);

    glEnable(GL_TEXTURE_RECTANGLE);

    while (!glfwWindowShouldClose(win)) {
        glfwPollEvents();

        glBegin(GL_QUADS);

        glTexCoord2i(0, 0);
        glVertex2i(-1, 1);

        glTexCoord2i(0, height);
        glVertex2i(-1, -1);

        glTexCoord2i(width, height);
        glVertex2i(1, -1);

        glTexCoord2i(width,0 );
        glVertex2i(1, 1);

        glEnd();

        glfwSwapBuffers(win);
    }

    glDeleteTextures(1, &tex);

    return 0;
}
...