2016-11-20 5 views
0

나는 어리 석거나 믿을 수 없을 정도로 미숙한데 (아마도 둘다)하지만 나는 어떻게 든 OpenGL을 사용하여 간단한 컬러 사각형을 그려 냈다. 방금 opengl 모델 로더를 완성 했으므로 문제가 될 수 없습니다 (그러나 첫 번째 프로젝트이므로 참조로 모든 것을 한 번했습니다). 어쨌든 파란색 배경을 제외하고는 아무 것도 나타나지 않습니다.OpenGL Rectangle 렌더링하지 않음

Ive는 기본 도형에 간단한 클래스를 만들려고했습니다. 다음은 사각형 클래스입니다.

class AVRect{ 
private: 
    AVcolor Color; 
    GLuint VBO, VAO, EBO; 
    GLuint indices[6] = { // Note that we start from 0! 
     0, 1, 3, // First Triangle 
     1, 2, 3 // Second Triangle 
    }; 
public: 
    GLfloat geometry[12]; 
    AVRect(int Drawmode, GLfloat x, GLfloat y, GLfloat x2, GLfloat y2,GLfloat x3, GLfloat y3, GLfloat x4, GLfloat y4,GLfloat r,GLfloat b,GLfloat g,GLfloat a); 
    void Draw(Shader shader); 
}; 

색상에 대해 걱정하지 마십시오. 필자는 소스에서만 설정했지만 다른 곳에서는 사용되지 않습니다. 필자는 ive가 고정 된 색상으로 작업하는 직사각형을 얻자 마자 구현할 것입니다. RECT 클래스의

출처 :

#include "stdafx.h" 
#include "Shapes.h" 

AVRect::AVRect(int Drawmode,GLfloat x, GLfloat y, GLfloat x2, GLfloat y2, GLfloat x3, GLfloat y3, GLfloat x4, GLfloat y4, GLfloat r, GLfloat b, GLfloat g, GLfloat a) { 
    geometry[0] = x; 
    geometry[1] = y; 
    geometry[2] = 0.0f; 
    geometry[3] = x2; 
    geometry[4] = y2; 
    geometry[5] = 0.0f; 
    geometry[6] = x3; 
    geometry[7] = y3; 
    geometry[8] = 0.0f; 
    geometry[9] = x4; 
    geometry[10] = y4; 
    geometry[11] = 0.0f; 
    Color.r = r; 
    Color.b = b; 
    Color.g = g; 
    Color.a = a; 
    glGenVertexArrays(1, &VAO); 
    glGenBuffers(1, &VBO); 
    glGenBuffers(1, &EBO); 
    glBindVertexArray(VAO); 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), geometry, Drawmode); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, Drawmode); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

} 

void AVRect::Draw(Shader shader) { 
    glUseProgram(shader.Program); 
    glBindVertexArray(VAO); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
    glBindVertexArray(0); 
} 

주요 꽤 자기 설명 :

// Bullethell.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <GL/glew.h> 
#include <SDL.h> 
#include <SDL_opengl.h> 
#include <GLTextures.h> 
#include <Shaders.h> 
#include <ctime> 
#include "Shapes.h" 
#define HEIGHT 600 
#define WIDTH 600 

int main(int argc, char* args[]) 
{ 
    SDL_Window *window; 
    SDL_Renderer *renderer; 
    window = SDL_CreateWindow("BulletHell", 100, 100, HEIGHT, WIDTH, SDL_WINDOW_OPENGL); 
    SDL_GLContext glcontext = SDL_GL_CreateContext(window); 

    glewExperimental = GL_TRUE; 
    if (GLEW_OK != glewInit()) 
    { 
     // GLEW failed! 
     printf("GLEW INIT FAILED!"); 
    } 
    Shader basic("./shaders/colorTest/colorTest.vs", "./shaders/colorTest/colorTest.frag"); 
    AVRect test(GL_STATIC_DRAW,0.5f,0.5f,0.5f,-0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.9f,0.2f,0.5f); 
    int error = 0; 
    while (SDL_PollEvent(NULL)) 
    { 
     clock_t start = clock(); 
     glClearColor(0.2, 0.2, 0.5, 1); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     test.Draw(basic); 
     SDL_GL_SwapWindow(window); 
     error = glGetError(); 
     if (error != GL_NO_ERROR) 
      printf("GL ERROR:%d ", error); 
     while (((clock() - start) * 1000/CLOCKS_PER_SEC) <16) 
      ; 

     float MS = (float)((clock() - start) * 1000/CLOCKS_PER_SEC); 
     // Frames per seconds 
     float FPS = 1000.0f/MS; 
     //printf("%f \n",FPS); 
     // printf("Status: Using GLEW %s\n", glewGetString(GLEW_VERSION)); 
    } 
    return 1; 
} 

셰이더 클래스는 테스트하고 노력하고 있습니다. 셰이더는 간단하며 작동해야합니다 (값만 전달하고 고정 된 색상 지정).

저는 오류가 표시되지 않기 때문에 아마도 눈이 멀었을 것입니다. 이것 좀 도와주세요.


가 여기에 완성도를 위해서 쉐이더 소스입니다 :

#include "stdafx.h" 
#include "Shaders.h" 

Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath) 
{ 
    // 1. Retrieve the vertex/fragment source code from filePath 
    std::string vertexCode; 
    std::string fragmentCode; 
    std::ifstream vShaderFile; 
    std::ifstream fShaderFile; 

    // ensures ifstream objects can throw exceptions: 
    vShaderFile.exceptions (std::ifstream::badbit); 
    fShaderFile.exceptions (std::ifstream::badbit); 
    try 
    { 
     // Open files 
     vShaderFile.open(vertexPath); 
     fShaderFile.open(fragmentPath); 
     std::stringstream vShaderStream, fShaderStream; 
     // Read file's buffer contents into streams 
     vShaderStream << vShaderFile.rdbuf(); 
     fShaderStream << fShaderFile.rdbuf(); 
     // close file handlers 
     vShaderFile.close(); 
     fShaderFile.close(); 
     // Convert stream into string 
     vertexCode = vShaderStream.str(); 
     fragmentCode = fShaderStream.str(); 
    } 
    catch (std::ifstream::failure e) 
    { 
     std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; 
    } 
    const GLchar* vShaderCode = vertexCode.c_str(); 
    const GLchar * fShaderCode = fragmentCode.c_str(); 
    // 2. Compile shaders 
    GLuint vertex, fragment; 
    GLint success; 
    GLchar infoLog[512]; 
    // Vertex Shader 
    vertex = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertex, 1, &vShaderCode, NULL); 
    glCompileShader(vertex); 
    // Print compile errors if any 
    glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); 
    if (!success) 
    { 
     glGetShaderInfoLog(vertex, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; 
    } 
    // Fragment Shader 
    fragment = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fragment, 1, &fShaderCode, NULL); 
    glCompileShader(fragment); 
    // Print compile errors if any 
    glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); 
    if (!success) 
    { 
     glGetShaderInfoLog(fragment, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; 
    } 
    // Shader Program 
    this->Program = glCreateProgram(); 
    glAttachShader(this->Program, vertex); 
    glAttachShader(this->Program, fragment); 
    glLinkProgram(this->Program); 
    // Print linking errors if any 
    glGetProgramiv(this->Program, GL_LINK_STATUS, &success); 
    if (!success) 
    { 
     glGetProgramInfoLog(this->Program, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; 
    } 
    // Delete the shaders as they're linked into our program now and no longer necessery 
    glDeleteShader(vertex); 
    glDeleteShader(fragment); 

} 
// Uses the current shader 
void Shader::Use() 
{ 
    glUseProgram(this->Program); 
} 
+0

소스를 메인 포스트에 추가했습니다. 내 다른 프로젝트 (텍스처와 기본 조명이있는 간단한 모델 로더)에 동일한 소스를 사용했으며 잘 작동했습니다. – MoustacheSpy

답변

3

당신은 타락한 삼각형을 그리는 것, 그래서 픽셀 렌더링되지 않습니다. 당신이 당신의 "직사각형"의 좌표를 보면, 쉽게 읽을 수 있도록 간격 : 당신은 2, 4 정점이 동일한 좌표를 가지고 있음을 알 수

0.5f, 0.5f, 
0.5f, -0.5f, 
-0.5f, -0.5f, 
0.5f, -0.5f 

. 당신의 정점의 배열은 다음과 같습니다 : 자신의 정점의 두 가지가 동일하기 때문에

0, 1, 3, // First Triangle 
1, 2, 3 // Second Triangle 

하고, 두 삼각형이 타락한 것을 볼 수 있습니다 :

 0 

2  1/3 

는 인덱스를 가지는 것을 비교.

은 당신이 아마 사용하는 의미 좌표

0.5f, 0.5f, 
0.5f, -0.5f, 
-0.5f, -0.5f, 
-0.5f, 0.5f 

실제로 지오메트리에 대한 시계 반대 방향으로 방향을 사용하는 것이 좋습니다 것, 이것은 OpenGL을 질서 권선의 기본이기 때문이다. 비록 당신이 도태를 가능하게 할 계획이 아니라면 그것은별로 중요하지 않습니다.

+0

고마워요! 잘 했어! – MoustacheSpy