2013-12-22 5 views
0

내 프로그램이 화면에 아무 것도 표시하지 않습니다. 나는 여러 가지를 시도했지만 아무 것도 효과가 없었다.OpenGL이 전혀 렌더링하지 않음

Renderer.cpp :

#include "Renderer.h" 

Renderer::Renderer(Camera& camera, float w, float h) 
    : 
cam(camera), 
winW(w), 
winH(h) 
{} 

Renderer::~Renderer() 
{ 
    glDeleteBuffers(1, &quad); 
    glDeleteBuffers(1, &color); 
    glDeleteBuffers(1, &UV); 
    glDeleteVertexArrays(1, &vao); 
} 

void Renderer::load() 
{ 
    projectionMatrix = glm::mat4(1.0f); 
    projectionMatrix = glm::perspective<float>(45.0f, (float) winW/(float) winH, 0.01f, 100.0f); 

    shader.loadAndCompile("Res/Shaders/std.vs", "Res/Shaders/std.fs"); 

    texture.loadTexture("Res/Tex/sheet.png"); 
    texture.bind(); 

    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    Vertex quadArray[] = { 
     { -0.5, -0.5, 0.0 }, 
     { -0.5, 0.5, 0.0 }, 
     { 0.5, -0.5, 0.0 }, 
     { 0.5, -0.5, 0.0 }, 
     { 0.5, 0.5, 0.0 }, 
     { -0.5, 0.5, 0.0 } 
    }; 

    glUseProgram(shader.getProgram()); 

    MVPLocation = glGetUniformLocation(shader.getProgram(), "MVP"); 

    glGenBuffers(1, &quad); 
    glBindBuffer(GL_ARRAY_BUFFER, quad); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(quadArray), quadArray, GL_STATIC_DRAW); 

    glGenBuffers(1, &color); 
    glBindBuffer(GL_ARRAY_BUFFER, color); 
    glBufferData(GL_ARRAY_BUFFER, 48, NULL, GL_STREAM_DRAW); 

    glGenBuffers(1, &UV); 
    glBindBuffer(GL_ARRAY_BUFFER, UV); 
    glBufferData(GL_ARRAY_BUFFER, 48, NULL, GL_STREAM_DRAW); 
} 

void Renderer::translate(glm::vec3 pos) 
{ 
    this->transMatrix = glm::translate(glm::mat4(1.0f), pos); 
} 

void Renderer::translate(float x, float y, float z) 
{ 
    translate(glm::vec3(x, y, z)); 
} 

void Renderer::rotate(float angle, glm::vec3 axis) 
{ 
    this->rotationMatrix = glm::rotate(glm::mat4(1.0f), angle, axis); 
} 

void Renderer::scale(glm::vec3 scale) 
{ 
    this->scaleMatrix = glm::scale(glm::mat4(1.0f), scale); 
} 

void Renderer::scale(float x, float y, float z) 
{ 
    scale(glm::vec3(x, y, z)); 
} 

void Renderer::drawSpriteBillboarded(glm::vec3 pos, glm::vec3 lookAtPos, int w, int h, int uP, int vP, glm::vec4 col) 
{ 
    int texW = texture.getWidth(), texH = texture.getHeight(); 

    float u = (float) uP/(float) texW, v = (float) vP/(float) texH, uEnd = (float) (uP + w)/(float) texW, vEnd = (float) (vP + h)/(float) texH; 

    Color colArray[] = { 
     { col.r, col.g, col.b, col.a }, 
     { col.r, col.g, col.b, col.a }, 
     { col.r, col.g, col.b, col.a }, 
     { col.r, col.g, col.b, col.a }, 
     { col.r, col.g, col.b, col.a }, 
     { col.r, col.g, col.b, col.a } 
    }; 

    Vertex uvArray[] = { 
     { u, v }, 
     { u, vEnd }, 
     { uEnd, v }, 
     { uEnd, v }, 
     { uEnd, vEnd }, 
     { u, vEnd } 
    }; 

    translate(pos); 

    glm::vec2 dist = glm::vec2(lookAtPos.x, lookAtPos.z) - glm::vec2(pos.x, pos.z); 

    rotate(atan2f(dist.y, dist.x), glm::vec3(0, 1, 0)); 

    scale(w/16 * 1.0, h/16 * 1.0, 1.0); 

    modelMatrix = transMatrix * rotationMatrix * scaleMatrix; 

    camTransMatrix = glm::translate(glm::mat4(1.0f), cam.getPos()); 
    camRotationMatrix = glm::rotate(camRotationMatrix, cam.getRotX(), glm::vec3(1, 0, 0)); 
    camRotationMatrix = glm::rotate(camRotationMatrix, cam.getRotY(), glm::vec3(0, 1, 0)); 
    camRotationMatrix = glm::rotate(camRotationMatrix, cam.getRotZ(), glm::vec3(0, 0, 1)); 
    viewMatrix = camTransMatrix * camRotationMatrix; 

    modelViewProjectionMatrix = projectionMatrix * viewMatrix * modelMatrix; 

    glUniformMatrix4fv(MVPLocation, 1, GL_FALSE, &modelViewProjectionMatrix[ 0 ][ 0 ]); 

    glBindBuffer(GL_ARRAY_BUFFER, quad); 

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); 

    glBindBuffer(GL_ARRAY_BUFFER, color); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(colArray), colArray, GL_STREAM_DRAW); 

    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, (void*)0); 

    glBindBuffer(GL_ARRAY_BUFFER, UV); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(uvArray), uvArray, GL_STREAM_DRAW); 

    glEnableVertexAttribArray(2); 
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); 
} 

void Renderer::drawSprite(glm::vec3 pos, int w, int h, int uP, int vP, glm::vec4 col) 
{} 

버텍스 쉐이더가

#version 330 core 

layout(location = 0) in vec3 vertPosition; 
layout(location = 1) in vec4 color; 
layout(location = 2) in vec2 in_UV; 

uniform mat4 MVP; 

out vec4 col; 
out vec2 uv; 

void main(void) 
{ 
    gl_Position = MVP * vec4(vertPosition, 1.0); 

    col = color; 
    uv = in_UV; 
} 

조각 쉐이더

#version 330 core 

in vec4 col; 
in vec2 uv; 

out vec4 color; 

uniform sampler2D tex; 

void main(void) 
{ 
    vec4 Color = texture2D(tex, uv) * col; 

    color = Color; 
} 

나는 drawSprit 전화

다음

내 소스, 버텍스와 프래그먼트 쉐이더의 지금처럼 내 게임 클래스에서 기능을 eBillboarded : 0, 0, 0

내가 MVP 행렬 곱하지 버텍스 쉐이더를 변경 시도도 변경 해봤에서

drawSpriteBillboarded(glm::vec3(0, 0, -5), cam.getPos(), 16, 16, 0, 0, glm::vec3(255, 255, 255, 255)); 

카메라의 위치입니다 프래그먼트 쉐이더를 다음으로 변경하십시오.

#version 330 core 

in vec4 col; 
in vec2 uv; 

out vec4 color; 

void main(void) 
{ 
    color = vec4(1.0, 1.0, 1.0, 1.0); 
} 

그러나 아무 것도 표시되지 않습니다. 나는 또한 GL_TRIANGLESGL_POINTS으로 변경하려고 시도했지만 아무 것도하지 않았습니다.

void Shader::loadAndCompile(const char* vertPath, const char* fragPath) 
{ 
    std::string vsCode = ""; 
    std::ifstream vsStream(vertPath, std::ios::in); 

    fprintf(stdout, "loading vertex shader %s\n", vertPath); 

    if(vsStream.is_open()) 
    { 
     std::string line; 
     while(std::getline(vsStream, line)) 
      vsCode += line + '\n'; 
     vsStream.close(); 
    } 
    else 
    { 
     fprintf(stderr, "Error: could not find vertex shader %s\n", vertPath); 
     return; 
    } 

    std::string fsCode = ""; 
    std::ifstream fsStream(fragPath, std::ios::in); 

    fprintf(stdout, "loading fragment shader %s\n", fragPath); 

    if(fsStream.is_open()) 
    { 
     std::string line; 
     while(std::getline(fsStream, line)) 
      fsCode += line + '\n'; 
     fsStream.close(); 
    } 
    else 
    { 
     fprintf(stderr, "Error: could not find fragment shader %s\n", fragPath); 
     return; 
    } 

    fprintf(stdout, "Compiling vertexShader %s\n", vertPath); 

    const char* vertCode = vsCode.c_str(); 
    GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); 

    glShaderSource(vertShader, 1, &vertCode, NULL); 
    glCompileShader(vertShader); 

    GLint result = GL_FALSE; 
    int infoLogLength; 

    glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result); 
    glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &infoLogLength); 

    if(infoLogLength > 0) 
    { 
     std::vector<char> errorMsg(infoLogLength); 
     glGetShaderInfoLog(vertShader, infoLogLength, NULL, &errorMsg[ 0 ]); 
     fprintf(stderr, "%s\n", &errorMsg[ 0 ]); 
    } 

    fprintf(stdout, "Compiling fragmentShader %s\n", fragPath); 

    const char* fragCode = fsCode.c_str(); 
    GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); 

    glShaderSource(fragShader, 1, &fragCode, NULL); 
    glCompileShader(fragShader); 

    glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result); 
    glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &infoLogLength); 

    if(infoLogLength > 0) 
    { 
     std::vector<char> errorMsg(infoLogLength); 
     glGetShaderInfoLog(fragShader, infoLogLength, NULL, &errorMsg[ 0 ]); 
     fprintf(stderr, "%s\n", &errorMsg[ 0 ]); 
    } 

    fprintf(stdout, "Linking program...\n"); 

    GLuint tmpProgID = glCreateProgram(); 

    glAttachShader(tmpProgID, vertShader); 
    glAttachShader(tmpProgID, fragShader); 
    glLinkProgram(tmpProgID); 

    glGetProgramiv(tmpProgID, GL_LINK_STATUS, &result); 
    glGetProgramiv(tmpProgID, GL_INFO_LOG_LENGTH, &infoLogLength); 
    if(infoLogLength > 0) 
    { 
     std::vector<char> errorMsg(infoLogLength); 
     glGetProgramInfoLog(tmpProgID, infoLogLength, NULL, &errorMsg[ 0 ]); 
     fprintf(stderr, "%s\n", &errorMsg[ 0 ]); 
    } 

    glDeleteShader(vertShader); 
    glDeleteShader(fragShader); 

    this->programID = tmpProgID; 
} 

그래서 나는 기본적으로 내가 (바보) 실수 있는지 확인하기 위해 내 코드를 확인을 부탁 해요 :

편집

나는 또한 loadAndCompile() 함수를 추가했다.

+0

적어도 흰색 화면이 표시 되나요? 당신이 얻는 결과는 무엇입니까? 셰이더 로그가로드되고 있는지 확인하려고 했습니까? – zero298

+0

예, 그들은 그들이해야하는 길을로드하고 있습니다. – Potte

+0

당신의 함수는'loadAndCompile (...)'만 호출 **로드 및 컴파일 **하거나 *** 링크 *** 귀하의 쉐이더합니까? 교복은 당신이 링크 할 때까지 위치를 가지지 않을 것이고,'glUseProgram (...)'은 아직 링크되지 않은 프로그램으로 그것을하려고하면 에러를 발생시킬 것이다. –

답변

0

해결! - 생성자가 호출 될 때 winW 및 winH 변수가 초기화되지 않았습니다. 또한 변경해야 함 glDrawElements(...)glDrawArrays(...)

관련 문제