2017-04-18 4 views
-2

저는 C++에서 OpenGL 코드를 작성하여 화면에 빨간색 삼각형을 렌더링했습니다. 이 프로그램은 OpenGL 3.3 및 glsl 버전 330을 사용합니다. 몇 가지 .cpp 클래스 파일이나 내 glsl 코드에서 작동하지 않는 코드를 좁혔습니다. 나는 어떤 컴파일러 나 링커 에러도 없다. (나는 링커 경고를 받는다. 그러나 나는 그것들이 중요하다고 생각하지 않는다.) 오류가 발생할 가능성이 가장 높은 곳에서 코드를 제공했습니다.OpenGL 삼각형이 렌더링되지 않습니다.

Renderer.cpp :

#include "Renderer.h" 

#include <GL/glew.h> 

void Renderer::render(int vbo){ 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    glDisableVertexAttribArray(0); 
} 

ShaderProgram.cpp

#pragma warning(disable:4101) 

#include "ShaderProgram.h" 

#include <fstream> 
#include <sstream> 

ShaderProgram::ShaderProgram(std::string vertexLocation, std::string fragmentLocation){ 
    programID = glCreateProgram(); 
    vertexID = glCreateShader(GL_VERTEX_SHADER); 
    fragmentID = glCreateShader(GL_FRAGMENT_SHADER); 
    createShader(vertexID, vertexLocation); 
    createShader(fragmentID, fragmentLocation); 
    glLinkProgram(programID); 
    GLint success; 
    glGetProgramiv(programID, GL_LINK_STATUS, &success); 
    if (success == 0) { 
     GLchar ErrorLog[1024]; 
     glGetProgramInfoLog(programID, sizeof(ErrorLog), nullptr, ErrorLog); 
     fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog); 
    } 
    glValidateProgram(programID); 
    glUseProgram(programID); 
} 

void ShaderProgram::createShader(GLint shaderID, std::string srcLocation){ 
    const std::string shaderText = loadShaderSource(srcLocation); 
    const GLchar* shaderSource = shaderText.data(); 
    glShaderSource(shaderID, 1, &shaderSource, nullptr); 
    glCompileShader(shaderID); 
    GLint success; 
    glGetShaderiv(shaderID, GL_COMPILE_STATUS, &success); 
    if (!success) { 
     GLchar InfoLog[1024]; 
     glGetShaderInfoLog(shaderID, sizeof(InfoLog), nullptr, InfoLog); 
     fprintf(stderr, "Error compiling shader: '%s'\n", InfoLog); 
    } 
    glAttachShader(programID, shaderID); 
} 

std::string ShaderProgram::loadShaderSource(std::string location){ 
    std::ifstream file (location); 
    std::string source; 
    std::stringstream stringStream; 

    if (!file.is_open()){ 
     throw std::runtime_error("Could not open file " + location); 
    } 

    stringStream << file.rdbuf(); 
    source = stringStream.str(); 

    return source; 
} 

Entity.cpp

#include "Entity.h" 

Entity::Entity(){ 
    vertices[0] = glm::vec3(-1.0f, -1.0f, 0.0f); 
    vertices[1] = glm::vec3(1.0f, -1.0f, 0.0f); 
    vertices[2] = glm::vec3(0.0f, 1.0f, 0.0f); 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glDisableVertexAttribArray(0); 
} 

int Entity::getID(){ 
    return vbo; 
} 

GLSL 코드 :
버텍스 쉐이더 :

#version 330 

layout (location = 0) in vec3 position; 

void main(){ 
    gl_Position = vec4(0.5 * position.x, 0.5 * position.y, position.z, 1.0); 
} 

조각 쉐이더 :

#version 330 

out vec4 colour; 

void main(){ 
    colour = vec4(1.0, 0.0, 0.0, 1.0); 
} 
+0

VAO (Vertex Array Object)를 사용해야합니다. – Ripi2

+0

@ Ripi2 : VAO는 호환성 컨텍스트에서 선택 사항입니다. – genpfault

+0

좋습니다, 감사합니다. 나는 시간이있을 때 그것을 내일 시도 할 것이다. 내가 따라하고있는 튜토리얼은 내가 추측하는 최선이 아니다. 그들은 좋은 결과를 얻지 못했습니다. – Matty2532

답변

0

당신이 캔트 사용 GLM이 :: 그것에 this.Reference 같은 VEC3는 실제 배열의 anything.Start 얻을 당신을 제공하지 않습니다

glm::vec3 k; 
float* t= &k[0]; 

하지만 난 당신도 그걸로 가치있는 것을 할 수 있을지 의심 해봐.

은 float GLfloat 배열을 사용합니다.

+0

하지만 glm :: value_ptr (k) 대신에 '& k [0]'. 기본적으로 똑같지 만, glm 라이브러리의 제안 된 방법입니다. –

관련 문제