Размер отрисовки OpenGL слишком большой

255
03 мая 2018, 10:07

Пытаюсь вывести квадрат размера 1x1 на экран в OpenGL, он должен рендериться на весь экран, так как координаты OpenGL 1x1, но он почему- то выводится далеко за пределы окна, вот пример квадрата 0.3x0.3:

public class Renderer {
    private final int vaoRectangle;
    private final int rectangleProgram;
    private final int rectangleBuffer;

    Vector3f cameraPosition = new Vector3f(0, 0, 1f);

    Renderer() throws Exception {
        glEnable(GL_DEPTH_TEST);
        glClearColor(0.04f, 1.0f, 0.2f, 1.0f);
        glPointSize(50);//размер точки

        String rectangleVertexSource = IOUtils.toString(getClass().getResourceAsStream("shaders/rectangle.vert"));
        String rectangleFragmentSource = IOUtils.toString(getClass().getResourceAsStream("shaders/rectangle.frag"));
        rectangleProgram = Util.createShaderProgram(rectangleVertexSource, rectangleFragmentSource);
        //заполняется в момент рендеринга
        vaoRectangle = glGenVertexArrays();//вао под прямоугольник
        glBindVertexArray(vaoRectangle);
        rectangleBuffer = glGenBuffers();//квадрат заполняется в момент рендеринга
    }

    private void drawLine(int i) {
        glUniform3f(glGetUniformLocation(rectangleProgram, "c"), 0, 0, 1);//верхняя
        glDrawArrays(GL_LINES, i, 2);
    }
    //рисование прямоугольника
    private void renderRectangle() {
        //матрица view 
        FloatBuffer vMatrix = BufferUtils.createFloatBuffer(16);
        new Matrix4f()
                .lookAt(cameraPosition.x, cameraPosition.y, cameraPosition.z,
                        0.0f, 0.0f, 0.0f,
                        0.0f, 1f, 0.0f).get(vMatrix);
        //матрица проекции
        Matrix4f p = new Matrix4f().perspective((float) Math.toRadians(45.0f), 480f / 480f, 0.01f, 100.0f);
        FloatBuffer pMatrix = BufferUtils.createFloatBuffer(16);
        {
            p.get(pMatrix);
        }
        //сделали копию матрицы проекции
        Matrix4f p1 = new Matrix4f().set(pMatrix);
        //сделали копию матрицы view
        Matrix4f v = new Matrix4f().set(vMatrix);
        //P*V
        Matrix4f q = p1.mul(v);
        FloatBuffer qF = BufferUtils.createFloatBuffer(16);
        q.get(qF);

        glUseProgram(rectangleProgram);
        glUniformMatrix4fv(glGetUniformLocation(rectangleProgram, "Q"), false, qF);
        glBindVertexArray(vaoRectangle);
        glBindBuffer(GL_ARRAY_BUFFER, rectangleBuffer);
        float k = 0.3f;
        FloatBuffer fl = BufferUtils.createFloatBuffer(3 * 8 * Float.BYTES).put(new float[]{
                k, k, 0, k, -k, 0,
                -k, -k, 0, k, -k, 0,
                -k, k, 0, -k, -k, 0,
                -k, k, 0, k, k, 0
        }).rewind();
        glBufferData(GL_ARRAY_BUFFER, fl, GL_STATIC_DRAW);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
        glEnableVertexAttribArray(0);
        //ОТРИСОВКА
        for (int i = 0; i < 8; i += 2)
            drawLine(i);
    }
    void render(MouseInput mouseInput) throws Exception {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
        renderRectangle();
    }
}

Вот, что выводится:

Ну это явно не 0.3x0.3. В чем причина, подскажите?

Answer 1

Во-первых, вы рисуете квадрат от -0.3 до +0.3 - значит его размер 0.6x0.6, а не 0.3x0.3.

Во-вторых, и в главных, проверьте, у вас перспективная матрица с углом 45 градусов. Камера у вас расположена на 1.0 по оси Z. Смотрит на 0.0. Квадрат вы рисуете также на 0.0 по оси Z. Размер квадрата будет зависеть от расстояния от камеры. Нарисуйте квадрат на расстоянии 10 (т.е. с координатой Z = -9.0), он станет меньше?

Как сделать, чтобы размер квадрата был 1.0 ? Либо найдите подходящее расстояние у перспективной камеры, либо, что правильнее, перейдите на использование ортогональной камеры (у нее размеры не зависят от расстояния).

READ ALSO
Правило выбора квалификатора ресурсов

Правило выбора квалификатора ресурсов

Имеются папки values и values-xhdpi

234
Как хранятся RGB Значения в DataBufferByte

Как хранятся RGB Значения в DataBufferByte

мне нужно из rgb значений DataBufferByte сделать массив нормализованных цветовых значений (float[]{0, 0, 01, 0

183
Байт в массив из битов

Байт в массив из битов

Как получить массив состоящий из 8 бит от одного символа ? Как я понял нужно сначала перевести символ в байт, но дальше у меня проблемы

214
Поиск всех контуров (циклов в орграфе)

Поиск всех контуров (циклов в орграфе)

Необходимо найти все контуры графаПримерно понимаю, что это делается через поиск в глубину, но вот как ни старайся, не выходит найти их полностью...

221