2017-01-25 1 views
0

그래서 OpenGL과 GLSL을 배우고 있습니다. 나는 행렬 변환에 대해 종교적으로 여러 튜토리얼을 따라 왔지만 왜 사각형이 렌더링되지 않는지 알 수 없다. 시행 착오를 통해 렌더링 코드가 괜찮다는 것을 알아 냈습니다. 단지 프로그램이 엉망인 버텍스 쉐이더에서 "변형 * vec4 (...)"를했을 때입니다. glGetUniformLocation의 반환 값을 확인하고 반환 값이 0이므로 유니폼의 위치가 표시됩니다. 나는 주변을 둘러 보았고 해결책을 찾지 못했습니다.내 GLSL 변환이 렌더링되지 않는 이유는 무엇입니까?

#include <stdio.h> 
#include <memory.h> 
#include <stdlib.h> 
#define GLEW_STATIC 
#include <glew.h> 
#include <SDL.h> 
#include <math.h> 
#include <glm/glm.hpp> 
#include <glm/gtc/type_ptr.hpp> 
#include <glm/gtc/matrix_transform.hpp> 

const GLchar* VertShaderCode = "\ 
#version 330 core\n\ 
layout (location = 0) in vec2 position;\n\ 
uniform mat4 transformation;\n\ 
void main()\n\ 
{\n\ 
    vec4 lol = transformation * vec4(position.xy, 0, 1);\n\ 
    gl_Position = lol;\n\ 
}\n\ 
"; 

const GLchar* FragShaderCode = "\ 
#version 330 core\n\ 
void main()\n\ 
{\n\ 
    gl_FragColor = vec4(1, 0, 1, 1);\n\ 
}\n\ 
"; 

#define SDL_main main 

#define scuffed !SDL_QuitRequested() 

int main() 
{ 
    if (SDL_Init(SDL_INIT_EVERYTHING)) 
    { 
     printf("Could not initialize SDL!\n"); 
     return -4; 
    }; 

    SDL_Window* window = SDL_CreateWindow("Testing Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 420, 420, SDL_WINDOW_OPENGL); 
    if (!window) 
    { 
     printf("Could not create window!\n"); 
     return -5; 
    }; 

    SDL_GLContext context = SDL_GL_CreateContext(window); 
    if (!context) 
    { 
     printf("Could not create context!\n"); 
     return -7; 
    }; 

    if (glewInit() != GLEW_OK) 
    { 
     printf("Could not initialize GLEW!\n"); 
     return -6; 
    }; 

    GLint err; 
    char* log = NULL; 

    //printf("Vertex Shader Source: \n%s\n",VertShaderCode); 
    GLuint VertShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(VertShader,1,&VertShaderCode,NULL); 
    glCompileShader(VertShader); 
    glGetShaderiv(VertShader,GL_COMPILE_STATUS,&err); 
    if (err == GL_FALSE) 
    { 
     // Shader didn't compile. 
     glGetShaderiv(VertShader, GL_INFO_LOG_LENGTH, &err); 
     log = (char*)malloc(err); 
     glGetShaderInfoLog(VertShader,err,NULL,log); 
     printf("Vertex shader could not be compiled!\n\n%s\n\n",log); 
     return -1; 
    }; 

    //printf("Fragment Shader Source: \n%s\n", FragShaderCode); 
    GLuint FragShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(FragShader, 1, &FragShaderCode, NULL); 
    glCompileShader(FragShader); 
    glGetShaderiv(FragShader, GL_COMPILE_STATUS, &err); 
    if (err == GL_FALSE) 
    { 
     // Shader didn't compile. 
     glGetShaderiv(FragShader, GL_INFO_LOG_LENGTH, &err); 
     log = (char*)malloc(err); 
     glGetShaderInfoLog(FragShader, err, NULL, log); 
     printf("Fragment shader could not be compiled!\n\n%s\n\n", log); 
     return -2; 
    }; 

    GLuint Program = glCreateProgram(); 
    glAttachShader(Program,VertShader); 
    glAttachShader(Program,FragShader); 
    glLinkProgram(Program); 
    glGetProgramiv(Program,GL_LINK_STATUS,&err); 
    if (err == GL_FALSE) 
    { 
     // Program didn't link. 
     glGetProgramiv(Program,GL_INFO_LOG_LENGTH,&err); 
     log = (char*)malloc(err); 
     glGetProgramInfoLog(Program,err,NULL,log); 
     printf("Program could not be linked!\n\n%s\n\n",log); 
     return -3; 
    }; 

    glUseProgram(Program); 

    GLuint vertBuff = 0, arrayBuff = 0, elementBuff = 0; 
    glGenVertexArrays(1, &arrayBuff); 
    glGenBuffers(1, &vertBuff); 
    glGenBuffers(1, &elementBuff); 
    glBindVertexArray(arrayBuff); 
    glBindBuffer(GL_ARRAY_BUFFER, vertBuff); 
    //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuff); 

    GLfloat vertices[] = 
    { 
     -0.5, 0.5, 
     -0.5, -0.5, 
     0.5, -0.5, 

     0.5, -0.5, 
     -0.5, 0.5, 
     0.5, 0.5, 
    }; 
    GLubyte colors[] = 
    { 
     255,0,0, 
     0,255,0, 
     0,0,255 
    }; 

    GLuint indicies[] = 
    { 
     0, 1, 2, 
     2, 0, 3, 
    }; 

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL); 

    glm::mat4 mat = glm::scale(mat, glm::vec3(2, .5, 0)); 
    glUniformMatrix4fv(glGetUniformLocation(Program, "transformation"), 1, GL_FALSE, glm::value_ptr(mat)); 

    while (scuffed) 
    { 
     glClear(GL_COLOR_BUFFER_BIT); 

     glDrawArrays(GL_TRIANGLES, 0, 6); 

     SDL_GL_SwapWindow(window); 
    } 

    glDeleteVertexArrays(1, &arrayBuff); 
    glDeleteBuffers(1, &vertBuff); 
    //glDeleteBuffers(1, &elementBuff); 

    SDL_GL_DeleteContext(context); 
    SDL_DestroyWindow(window); 
    SDL_Quit(); 

    return 0; 
} 

답변

2

문제는 쉐이더의 코드가 아니라 데이터 당신이 transformation에 전달합니다.

glm::mat4 mat = glm::scale(mat, glm::vec3(2, .5, 0)); 

glm::scale function이 (가) mat 당신이 전달하는 문제에 새로운 확장 기능을 곱한 scale에 전달할 때 mat이 초기화되지 않고 임의의 가비지가 포함되어 있습니다. 당신이 실제로 원하는 것은 첫번째 행렬을 초기화하는 것입니다 (단위 행렬로,하지만 기본 동작입니다), 그리고 규모에 전달 :이 두 버전은 이후 C++로 해당 아니라는 것을,

glm::mat4 mat; 
mat = glm::scale(mat, glm::vec3(2, .5, 0)); 

주 첫 번째 버전은 함수에 전달하기 전에 mat의 생성자를 호출하지 않습니다.

+1

감사합니다. 나는 그것을 시험해 보았는데, 이것은 효과가있는 것처럼 보였다. 나는 자습서를보기 위해 되돌아 갔고, 다른 사람들이하지 않았을 때 그것을 정확하게 말했습니다. 일부 사람들은 자신의 코드가 작동하는지 확인하지 않고 자신이 주장하는만큼 좋지 않다고 생각합니다. 감사! – CNJMC1

관련 문제