2017-10-22 11 views
2

저는 SDL2로 OpenGL을 배우고, this tutorial 다음에 다각형 그리기 -> 셰이더 부분을 보았습니다. 내가 튜토리얼이 지시 한 모든 것을 수행하고 있지만 그러나, 나는 원래 code에 비해OpenGL도 SDL도 GLSL도 오류를 발생시키지 않습니다. 그려지는 폴리곤이 없습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 
#include <iostream> 

//Glew 
#define GLEW_STATIC 
#include <GL/glew.h> 

//SDL headers 
#include "SDL.h" 
#include "SDL_opengl.h" 

//OpenGL headers 
#include <OpenGL/gl.h> 
#include <OpenGL/glext.h> 

//Constants 
#define SCREEN_H 800 
#define SCREEN_W 600 
#define SCREEN_POS_X 0 
#define SCREEN_POS_Y 0 
#define SCREEN_FLAGS SDL_WINDOW_SHOWN|SDL_WINDOW_INPUT_FOCUS|SDL_WINDOW_MOUSE_FOCUS|SDL_WINDOW_OPENGL 
//SDL_WINDOWPOS_CENTERED 
bool done = false; 

SDL_Window * pWindow = NULL; 
SDL_GLContext pGLContext = NULL; 

//Methods 
int Init(void); 
void GameLoop(); 
void Render(); 
void EventTick(); 
void Quit(void); 

    // Shader sources 
const GLchar* vertexSource = R"glsl(
    #version 150 core 
    in vec2 position; 
    void main() 
    { 
     gl_Position = vec4(position, 0.0, 1.0); 
    } 
)glsl"; 

const GLchar* fragmentSource = R"glsl(
    #version 150 core 
    out vec4 outColor; 
    void main() 
    { 
     outColor = vec4(1.0, 1.0, 1.0, 1.0); 
    } 
)glsl"; 


int main(int argc, char const *argv[]) 
{ 
    Init(); 
    GameLoop(); 
    Quit(); 
    return 0; 
} 

int Init() 
{ 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     fprintf(stderr, "SDL_Error: %s\n", SDL_GetError()); 
     return -1; 
    } 

    //Compatibility 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); 
    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); 

    pWindow = SDL_CreateWindow("Main", SCREEN_POS_X, SCREEN_POS_Y, SCREEN_W, SCREEN_H, SCREEN_FLAGS); 
    if (pWindow == NULL) 
    { 
     fprintf(stderr, "SDL_Error: %s\n", SDL_GetError()); 
     return -1; 
    } 

    pGLContext = SDL_GL_CreateContext(pWindow); 

    glewExperimental = GL_TRUE; 
    glewInit(); 


    return 0; 
} 

void GameLoop() 
{ 
    printf("%s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); 
    printf("%s\n", glGetString(GL_VERSION)); 
    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    float Vertices[] = { 
     0.0f, 20.0f, 
     20.0f, 0.0f, 
     20.0f, 20.0f 
    }; 

    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertexShader, 1, &vertexSource, NULL); 
    glCompileShader(vertexShader); 

    //Check the vertex shader compilation 
    GLint status_vertex; 
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status_vertex); 
    if (status_vertex != GL_TRUE) 
    { 
     char buffer[512]; 
     glGetShaderInfoLog(vertexShader, 512, NULL, buffer); 
     fprintf(stdout, "Vertex Shader: %s\n", buffer); 
    } 

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragmentShader, 1, &fragmentSource, NULL); 
    glCompileShader(fragmentShader); 

    //Check the fragment shader compilation 
    GLint status_fragment; 
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &status_fragment); 
    if (status_fragment != GL_TRUE) 
    { 
     char buffer[512]; 
     glGetShaderInfoLog(fragmentShader, 512, NULL, buffer); 
     fprintf(stdout, "Fragment Shader: %s\n", buffer); 
    } 

    GLuint shaderProgram = glCreateProgram(); 
    if (shaderProgram == 0) 
    { 
     fprintf(stderr, "glGetError: %u\n", glGetError()); 
    } 
    glBindAttribLocation(shaderProgram, 0, "position"); 
    glAttachShader(shaderProgram, vertexShader); 
    glAttachShader(shaderProgram, fragmentShader); 
    glBindFragDataLocation(shaderProgram, 0, "outColor"); 
    glLinkProgram(shaderProgram); 
    glUseProgram(shaderProgram); 

    GLint posAttrib = glGetAttribLocation(shaderProgram, "position"); 
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(posAttrib); 

    GLint program_linked; 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &program_linked); 
    if (program_linked != GL_TRUE) 
    { 
     GLsizei log_length = 0; 
     GLchar message[1024]; 
     glGetProgramInfoLog(shaderProgram, 1024, &log_length, message); 
     fprintf(stdout, "%s\n", message); 
    } 
    fprintf(stderr, "glGetError (End): %u\n", glGetError()); 
    fprintf(stderr, "SDL Error: %s\n", SDL_GetError()); 
    while(!done) 
    { 
     EventTick(); 
     Render(); 
    } 
    fprintf(stderr, "glGetError (End): %u\n", glGetError()); 
    fprintf(stderr, "SDL Error: %s\n", SDL_GetError()); 

    glDeleteProgram(shaderProgram); 
    glDeleteShader(fragmentShader); 
    glDeleteShader(vertexShader); 
    glDeleteBuffers(1, &vbo); 
    glDeleteVertexArrays(1, &vao); 
} 

void Render() 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(0.0f, 1.0f, 0.0f); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    SDL_GL_SwapWindow(pWindow); 

} 

void EventTick() 
{ 
    SDL_Event s_GameEngEvent; 
    while(SDL_PollEvent(&s_GameEngEvent)) 
    { 
     switch(s_GameEngEvent.type) 
     { 
      case SDL_QUIT: 
      { 
       fprintf(stdout, "SQL is quitting...\n"); 
       done = true; 
      }break; 

      case SDL_KEYDOWN: 
      { 
       switch(s_GameEngEvent.key.keysym.scancode) 
       { 
        case SDL_SCANCODE_ESCAPE: 
         { 
         fprintf(stdout, "SQL is quitting...\n"); 
         done = true; 
         }break; 
        default: 
        break; 
       } 
      }break; 
     } 
    } 

} 

void Quit(void) 
{ 
    //Destructions... 
    SDL_GL_DeleteContext(pGLContext); 
    SDL_DestroyWindow(pWindow); 
    SDL_Quit(); 
} 
내가 코드 하나 하나의 여러 부분이

하고, 코드의 출력을 얻을 수 아니에요 그러나 아무것도 발견하지 못했습니다.

누군가가 문제가있는 부분이 어디인지 확인할 수 있으면 정말 감사하겠습니다. 위의 코드를 작성하지 않았다는 것을 알고, OpenGL의 작동 방식에 초점을 맞추려고했지만, 당분간 목표는 내가 작성한 오류를 찾는 것입니다.

참고 : 여기에 그러한 질문이 받아 들일 수 있는지 확실하지 않습니다. 그렇다면 닫으십시오.

편집 : g ++에서 C++ 11을 사용하여 코드를 컴파일하고 있습니다.

+0

C++로 프로그래밍하는 경우 C 언어 태그를 추가하지 마십시오. –

+0

@Someprogrammerdude "fprintf, printf, ..."함수는 C 언어에 속하므로 일반적으로 사용하므로 C 언어를 추가 할 동기가되었습니다. 나는 원래 C 프로그래머 였고, 나는 그렇게 많이했다. – onurcanbektas

+5

C++로 프로그래밍 할 때 C++ 인 헤더 파일 만 사용하면 C++ 전용 표현식과 리터럴을 사용할 수 있습니다. C에서 나온 구형 함수를 사용하더라도 C++로 된 프로그램입니다. 이것이 귀하가 사용해야하는 유일한 태그입니다. –

답변

3

그리려는 삼각형이 보이는 영역 밖에 있습니다. 기본적으로 (즉, 투영/변형이 적용되지 않은 것을 의미합니다.) 가시 영역은 세 축 모두에서 -1에서 1로 이동합니다. 코드에서 사용 된 삼각형이이 영역과 교차하지 않으므로 렌더링되지 않습니다.

이외 : 코어 프로파일에서 더 이상 사용되지 않는 glColor3f 함수를 호출하고 있습니다. 오류 체크는 렌더 루프가 끝났을 때만 발생하기 때문에 가장 보이지 않는 GL_INVALID_OPERATION을보고해야합니다. 정말로 렌더 루프 안의 어딘가에서 오류를 확인해야합니다.

+0

실제로 생각해 보았지만 가시 범위가 모든 축에서 -1과 1 사이에서 다양하다는 것을 알지 못했습니다. 고마워. – onurcanbektas