2016-07-26 2 views
2

저는 glfw로 기본 그래픽을 만드는 방법에 대한 짧은 YouTube 튜토리얼을 따라 왔습니다. 색깔을 바꾸기 위해 삼각형을 만들 수는 없습니다.GLFW 삼각형이 색상을 변경하지 않습니다

주요 코드 :

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

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 

std::string LoadFileToString(const char* filepath) 
{ 
    std::string fileData; 
    std::ifstream stream(filepath, std::ios::in); 

    if (stream.is_open()) 
    { 
     std::string line = ""; 

     while (getline(stream, line)) 
     { 
      fileData += "\n" + line; 
     } 

     stream.close(); 
    } 

    return fileData; 
} 

GLuint LoadShaders(const char* vertShaderPath, const char* fragShaderPath) 
{ 
    GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); 
    GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); 

    std::string vertShaderSource = LoadFileToString(vertShaderPath); 
    std::string fragShaderSource = LoadFileToString(vertShaderPath); 

    const char* rawVertShaderSource = vertShaderSource.c_str(); 
    const char* rawFragShaderSource = fragShaderSource.c_str(); 

    glShaderSource(vertShader, 1, &rawVertShaderSource, NULL); 
    glShaderSource(fragShader, 1, &rawFragShaderSource, NULL); 

    glCompileShader(vertShader); 
    glCompileShader(fragShader); 

    GLuint program = glCreateProgram(); 
    glAttachShader(program, vertShader); 
    glAttachShader(program, fragShader); 
    glLinkProgram(program); 

    return program; 
} 

int main() 
{ 
    if (glfwInit() == false) 
    { 
     //did not succeed 
     fprintf(stderr, "GLFW failed to initialise."); 
     return -1; 
    } 

    //4 AA 
    glfwWindowHint(GLFW_SAMPLES, 4); 
    //tells glfw to set opengl to 3.3 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    GLFWwindow* window; 
    window = glfwCreateWindow(640, 480, "DJ KELLER KEEMSTAR", NULL, NULL); 

    if (!window) 
    { 
     fprintf(stderr, "Window failed to create"); 
     glfwTerminate(); 
     return -1; 
    } 

    glfwMakeContextCurrent(window); 
    glewExperimental = true; 

    if (glewInit() != GLEW_OK) 
    { 
     fprintf(stderr, "Glew failed to initialise"); 
     glfwTerminate(); 
     return -1; 
    } 

    //generate VAO 
    GLuint vaoID; 
    glGenVertexArrays(1, &vaoID); 
    glBindVertexArray(vaoID); 

    static const GLfloat verts[] = 
    { 
     //X, Y, Z 
     -1.0f, -1.0f, 0.0f, 
     1.0f, -1.0f, 0.0f, 
     0.0f, 1.0f, 0.0f 
    }; 

    GLuint program = LoadShaders("shader.vertshader", "shader.fragshader"); 

    //generate VBO 
    GLuint vboID; 
    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 

    glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    do 
    { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glEnableVertexAttribArray(0); 

     glBindBuffer(GL_ARRAY_BUFFER, vboID); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

     glUseProgram(program); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glDisableVertexAttribArray(0); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 

    } while (glfwWindowShouldClose(window) == false); 

    return 0; 
} 

fragshader :

#version 330 core 
out vec3 color; 

void main() 
{ 
    color = vec3(1,0,0); 
} 

vertshader : 삼각형 붉은 있어야하는데

#version 330 core 
layout(location = 0) in vec3 in_pos; 

void main() 
{ 
    gl_Position.xyz = in_pos; 
    gl_Position.w = 1; 
} 

:

not red triangle

+0

'out vec3 color;를'out vec4 c '로 대체하면 작동합니까? 'color = vec4 (1,0,0,1);'와'color = vec3 (1,0,0); – SurvivalMachine

+0

번호. 나는 vec3에서 vec4까지 레이아웃 (장소 = 0)을 바꾸려고 노력했다. 아직도 작동하지 않습니다. –

+0

멀티 샘플링없이 작동합니까 ('glfwWindowHint (GLFW_SAMPLES, 4);')? – SurvivalMachine

답변

4
std::string vertShaderSource = LoadFileToString(vertShaderPath); 
std::string fragShaderSource = LoadFileToString(vertShaderPath); 
               ^^^^^^^^^^^^^^ wat 

프래그먼트 셰이더로 버텍스 쉐이더를 사용하지 마십시오. ...

GLuint program = Program::Load 
    (
    vert, GL_VERTEX_SHADER, 
    vert, GL_VERTEX_SHADER, 
    NULL 
    ); 

조기 구제와 줄 것이다 :

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
#include <iostream> 
#include <cstdarg> 

struct Program 
{ 
    static GLuint Load(const char* shader, ...) 
    { 
     GLuint prog = glCreateProgram(); 
     va_list args; 
     va_start(args, shader); 
     while(shader) 
     { 
      const GLenum type = va_arg(args, GLenum); 
      AttachShader(prog, type, shader); 
      shader = va_arg(args, const char*); 
     } 
     va_end(args); 
     glLinkProgram(prog); 
     CheckStatus(prog); 
     return prog; 
    } 

private: 
    static void CheckStatus(GLuint obj) 
    { 
     GLint status = GL_FALSE; 
     if(glIsShader(obj)) glGetShaderiv(obj, GL_COMPILE_STATUS, &status); 
     if(glIsProgram(obj)) glGetProgramiv(obj, GL_LINK_STATUS, &status); 
     if(status == GL_TRUE) return; 
     GLchar log[ 1 << 15 ] = { 0 }; 
     if(glIsShader(obj)) glGetShaderInfoLog(obj, sizeof(log), NULL, log); 
     if(glIsProgram(obj)) glGetProgramInfoLog(obj, sizeof(log), NULL, log); 
     std::cerr << log << std::endl; 
     exit(EXIT_FAILURE); 
    } 

    static void AttachShader(GLuint program, GLenum type, const char* src) 
    { 
     GLuint shader = glCreateShader(type); 
     glShaderSource(shader, 1, &src, NULL); 
     glCompileShader(shader); 
     CheckStatus(shader); 
     glAttachShader(program, shader); 
     glDeleteShader(shader); 
    } 
}; 

#define GLSL(version, shader) "#version " #version "\n" #shader 

const char* vert = GLSL 
(
    330 core, 
    layout(location = 0) in vec3 in_pos; 
    void main() 
    { 
     gl_Position.xyz = in_pos; 
     gl_Position.w = 1; 
    } 
); 

const char* frag = GLSL 
(
    330 core, 
    out vec3 color; 
    void main() 
    { 
     color = vec3(1,0,0); 
    } 
); 

int main() 
{ 
    if (glfwInit() == false) 
    { 
     //did not succeed 
     fprintf(stderr, "GLFW failed to initialise."); 
     return -1; 
    } 

    //4 AA 
    glfwWindowHint(GLFW_SAMPLES, 4); 
    //tells glfw to set opengl to 3.3 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    GLFWwindow* window = glfwCreateWindow(640, 480, "DJ KELLER KEEMSTAR", NULL, NULL); 
    if (!window) 
    { 
     fprintf(stderr, "Window failed to create"); 
     glfwTerminate(); 
     return -1; 
    } 

    glfwMakeContextCurrent(window); 

    glewExperimental = true; 
    if (glewInit() != GLEW_OK) 
    { 
     fprintf(stderr, "Glew failed to initialise"); 
     glfwTerminate(); 
     return -1; 
    } 

    //generate VAO 
    GLuint vaoID; 
    glGenVertexArrays(1, &vaoID); 
    glBindVertexArray(vaoID); 

    static const GLfloat verts[] = 
    { 
     //X, Y, Z 
     -1.0f, -1.0f, 0.0f, 
     1.0f, -1.0f, 0.0f, 
     0.0f, 1.0f, 0.0f 
    }; 

    GLuint program = Program::Load 
     (
     vert, GL_VERTEX_SHADER, 
     frag, GL_FRAGMENT_SHADER, 
     NULL 
     ); 

    //generate VBO 
    GLuint vboID; 
    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 

    glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    do 
    { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glEnableVertexAttribArray(0); 

     glBindBuffer(GL_ARRAY_BUFFER, vboID); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

     glUseProgram(program); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 

     glDisableVertexAttribArray(0); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 

    } while (glfwWindowShouldClose(window) == false); 

    return 0; 
} 

그런 식으로 당신이 뭔가를 시도하는 경우 :

는 쉐이더를 조립하는 동안 컴파일 및 링크 상태/로그를 조회 추천 무엇이 잘못되었는지 더 잘 보여줍니다.

Vertex shader(s) failed to link. 
Vertex link error: INVALID_OPERATION. 
ERROR: 0:2: error(#248) Function already has a body: main 
ERROR: error(#273) 1 compilation errors. No code generated 
관련 문제