OpenGL 4를 사용한 회전 매트릭스

user3103398

행렬을 사용하여 OpenGL 4로 삼각형을 회전하려고하는데 삼각형이 중간에 있으면 반대 방향으로 보입니다. 분명히 회전 방향이 아니므로 어딘가에 깊이 버퍼가 잘못되어 있어야합니다. 이 문제를 해결하려고 시도했지만 OpenGL 4에서 회전의 예를 찾지 못했으며 감가 상각 된 기능을 사용하는 경우 만 있습니다. 내 코드는 다음과 같습니다.

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include "maths_funcs.h"
#include "maths_funcs.cpp"

const char* vertex_shader =
"#version 400\n"
"layout(location = 0) in vec3 vertex_position;"
"layout(location = 1) in vec3 vertex_colour;"
"uniform mat4 pmatrix;"
"uniform mat4 rmatrix;"
"uniform mat4 smatrix;"
"out vec3 colour;"
"void main () {"
"  colour = vertex_colour;"
"  gl_Position = smatrix * rmatrix * vec4 (vertex_position, 1.0);"
"}";

const char* fragment_shader =
"#version 400\n"
"in vec3 colour;"
"out vec4 frag_colour;"
"void main () {"
"  frag_colour = vec4 (colour, 1.0);"
"}";

float angle = 0.0f;

int main () {
    // start GL context and O/S window using the GLFW helper library
    if (!glfwInit ()) {
        fprintf (stderr, "ERROR: could not start GLFW3\n");
        return 1;
    } 

    GLFWwindow* window = glfwCreateWindow (640, 480, "Triangle Rotation test", NULL, NULL);
    if (!window) {
        fprintf (stderr, "ERROR: could not open window with GLFW3\n");
        glfwTerminate();
        return 1;
    }
    glfwMakeContextCurrent (window);

    // start GLEW extension handler
    glewExperimental = GL_TRUE;
    glewInit ();

    // get version info
    const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
    const GLubyte* version = glGetString (GL_VERSION); // version as a string
    printf ("Renderer: %s\n", renderer);
    printf ("OpenGL version supported %s\n", version);

    // tell GL to only draw onto a pixel if the shape is closer to the viewer
    glEnable (GL_DEPTH_TEST); // enable depth-testing
    glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer"

    float points[] = {
        0.0f,  0.5f,  0.0f,
        0.5f, -0.5f,  0.0f,
        -0.5f, -0.5f,  0.0f
    };

    float colours[] = {
        1.0f, 0.0f,  0.0f,
        0.0f, 1.0f,  0.0f,
        0.0f, 0.0f,  1.0f
    };

    float pmatrix[] = {
        1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f, 0.0f, 
        0.0f, 0.0f, 1.0f, 0.0f, 
        0.0f, 0.0f, 0.0f, 1.0f
    };

    float rmatrix[] = {
        cos(10), 0.0f, sin(10), 0.0f,
        0.0f, 1.0f, 0.0f, 0.0f, 
        -sin(10), 0.0f, cos(10), 0.0f, 
        0.0f, 0.0f, 0.0f, 1.0f
    };

    float smatrix[] = {
        1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, cos(10), sin(10), 0.0f, 
        0.0f, -sin(10), cos(10), 0.0f, 
        0.0f, 0.0f, 0.0f, 1.0f
    };

    GLuint vbo = 0;
    glGenBuffers (1, &vbo);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW);

    unsigned int colours_vbo = 0;
    glGenBuffers (1, &colours_vbo);
    glBindBuffer (GL_ARRAY_BUFFER, colours_vbo);
    glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), colours, GL_STATIC_DRAW);

    GLuint vao = 0;
    glGenVertexArrays (1, &vao);
    glBindVertexArray (vao);
    glEnableVertexAttribArray (0);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    glBindBuffer (GL_ARRAY_BUFFER, colours_vbo);
    glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 0, NULL);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    GLuint vs = glCreateShader (GL_VERTEX_SHADER);
    glShaderSource (vs, 1, &vertex_shader, NULL);
    glCompileShader (vs);
    GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
    glShaderSource (fs, 1, &fragment_shader, NULL);
    glCompileShader (fs);

    GLuint shader_programme = glCreateProgram ();
    glAttachShader (shader_programme, fs);
    glAttachShader (shader_programme, vs);
    glLinkProgram (shader_programme);

    int pmatrix_location = glGetUniformLocation (shader_programme, "pmatrix");
    int rmatrix_location = glGetUniformLocation (shader_programme, "rmatrix");
    int smatrix_location = glGetUniformLocation (shader_programme, "smatrix");

    while (!glfwWindowShouldClose (window)) {
        // wipe the drawing surface clear
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glUseProgram (shader_programme);
        rmatrix[0] = cos(angle);
        rmatrix[2] = sin(angle);
        rmatrix[8] = -sin(angle);
        rmatrix[10] = cos(angle);

        smatrix[5] = cos(angle);
        smatrix[6] = sin(angle);
        smatrix[9] = -sin(angle);
        smatrix[10] = cos(angle);
        glUniformMatrix4fv (pmatrix_location, 1, GL_FALSE, pmatrix);
        glUniformMatrix4fv (rmatrix_location, 1, GL_FALSE, rmatrix);
        glUniformMatrix4fv (smatrix_location, 1, GL_FALSE, smatrix);
        glBindVertexArray (vao);
        // draw points 0-3 from the currently bound VAO with current in-use shader
        glDrawArrays (GL_TRIANGLES, 0, 3);
        // update other events like input handling 
        glfwPollEvents ();
        // put the stuff we've been drawing onto the display
        glfwSwapBuffers (window);

        angle+=0.01f;
        if (angle >= 3.14f) {
            angle = -3.14f;
        }
    }

    // close GL context and any other GLFW resources
    glfwTerminate();
    return 0;
}
레토 코라디

투영 행렬을 사용하지 않기 때문에 정점 셰이더에서 z 좌표를 반전해야합니다. 이 줄을 변경하십시오.

gl_Position = smatrix * rmatrix * vec4 (vertex_position, 1.0);

다음과 같이 :

vec4 eyePos = smatrix * rmatrix * vec4 (vertex_position, 1.0);
gl_Position = vec4(eyePos.xy, -eyePos.z, eyePos.w);

gl_Position값에 의한 분할 후 클립 좌표이다 wNDC 결과 (디바이스 좌표를 규격화). 세계 좌표계는 일반적으로, Z가 축 화면 지적으로 오른손 좌표계에서 규정하고 있지만, NDC가있다 왼손잡이 좌표계의 z는 축 가리키는, 화면.

일반적인 투영 변환은 화면 밖에서 화면으로 z 좌표를 뒤집는 작업을 처리합니다. 그러나 투영 변환을 사용하지 않는 경우 z 좌표를 직접 뒤집어 야합니다.

또한 실제로 깊이 버퍼가 있는지 다시 확인하고 싶을 수 있습니다. 아마 전에 이것을 추가하십시오 glfwCreateWindow():

glfwWindowHint(GLFW_DEPTH_BITS, 24);

GLFW 문서에서 찾을 수있는 내용에 따르면 이것이 아마도 기본값 일 것입니다. 그러나 그것을 명시 적으로 지정하는 것은 나쁠 수 없습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

GLM (회전)을 사용하여 OpenGL 용 변환 매트릭스 만들기

분류에서Dev

OpenGL 모델 매트릭스가 한 번 회전 한 후 원점을 중심으로 회전하지 않음

분류에서Dev

OpenCV를 사용한 카메라 보정 : 왜곡 및 회전 변환 매트릭스 사용

분류에서Dev

jquery를 사용한 텍스트 회전

분류에서Dev

OpenGL에서 회전 매트릭스 저장

분류에서Dev

openGL에서 매트릭스 회전 / 변환 / 크기 조정

분류에서Dev

쌍 선형 보간을 사용한 2D 매트릭스 회전

분류에서Dev

자바 스크립트를 사용한 SVG 회전

분류에서Dev

사전 정의 된 거리 / 유사성 매트릭스를 사용한 R 데이터 클러스터링

분류에서Dev

매트릭스 회전이 발생한 후 Vector3 조정

분류에서Dev

화면 회전을위한 매트릭스 구조

분류에서Dev

가속도계 변환을위한 Android 회전 매트릭스

분류에서Dev

Applescript를 사용한 스푸핑 및 회전 MAC 주소

분류에서Dev

OpenGl 사용자 지정 회전 문제

분류에서Dev

OpenGL은 glm을 사용하여 개체를 개별적으로 회전

분류에서Dev

Android OpenGL ES 2 텍스처 사분면 회전

분류에서Dev

Android OpenGL ES 2 텍스처 사분면 회전

분류에서Dev

Theano를 사용한 매트릭스 트리플 제품

분류에서Dev

GLFW-마우스로 카메라의 뷰 매트릭스를 회전하면 회전합니다.

분류에서Dev

이미 회전 중일 때 클릭시 div를 사용자 정의 회전

분류에서Dev

이미 회전 중일 때 클릭시 div를 사용자 정의 회전

분류에서Dev

OpenGL 반원형 회전 및 1/4 원

분류에서Dev

Android 컨텍스트를 사용한 OpenGL 텍스처링

분류에서Dev

GLUT에서 키를 사용한 회전

분류에서Dev

Graphics2D를 사용한 회전

분류에서Dev

CSS를 사용한 큐브 회전

분류에서Dev

AutoLisp를 사용한 AutoCad 회전 명령

분류에서Dev

OpenCV를 사용한 매트릭스 추출

분류에서Dev

회전 수에 대한 매트릭스 통과시 최대 합계

Related 관련 기사

  1. 1

    GLM (회전)을 사용하여 OpenGL 용 변환 매트릭스 만들기

  2. 2

    OpenGL 모델 매트릭스가 한 번 회전 한 후 원점을 중심으로 회전하지 않음

  3. 3

    OpenCV를 사용한 카메라 보정 : 왜곡 및 회전 변환 매트릭스 사용

  4. 4

    jquery를 사용한 텍스트 회전

  5. 5

    OpenGL에서 회전 매트릭스 저장

  6. 6

    openGL에서 매트릭스 회전 / 변환 / 크기 조정

  7. 7

    쌍 선형 보간을 사용한 2D 매트릭스 회전

  8. 8

    자바 스크립트를 사용한 SVG 회전

  9. 9

    사전 정의 된 거리 / 유사성 매트릭스를 사용한 R 데이터 클러스터링

  10. 10

    매트릭스 회전이 발생한 후 Vector3 조정

  11. 11

    화면 회전을위한 매트릭스 구조

  12. 12

    가속도계 변환을위한 Android 회전 매트릭스

  13. 13

    Applescript를 사용한 스푸핑 및 회전 MAC 주소

  14. 14

    OpenGl 사용자 지정 회전 문제

  15. 15

    OpenGL은 glm을 사용하여 개체를 개별적으로 회전

  16. 16

    Android OpenGL ES 2 텍스처 사분면 회전

  17. 17

    Android OpenGL ES 2 텍스처 사분면 회전

  18. 18

    Theano를 사용한 매트릭스 트리플 제품

  19. 19

    GLFW-마우스로 카메라의 뷰 매트릭스를 회전하면 회전합니다.

  20. 20

    이미 회전 중일 때 클릭시 div를 사용자 정의 회전

  21. 21

    이미 회전 중일 때 클릭시 div를 사용자 정의 회전

  22. 22

    OpenGL 반원형 회전 및 1/4 원

  23. 23

    Android 컨텍스트를 사용한 OpenGL 텍스처링

  24. 24

    GLUT에서 키를 사용한 회전

  25. 25

    Graphics2D를 사용한 회전

  26. 26

    CSS를 사용한 큐브 회전

  27. 27

    AutoLisp를 사용한 AutoCad 회전 명령

  28. 28

    OpenCV를 사용한 매트릭스 추출

  29. 29

    회전 수에 대한 매트릭스 통과시 최대 합계

뜨겁다태그

보관