2017-09-13 1 views
0

Udemy - Modern Opengl 3.0에 대한 자습서를 진행하고 있습니다. 나는 기본적인 튜토리얼 파트 5 "투영 및 좌표계"를 다룰 수있었습니다. 이 코드는 Mac에서 완벽하게 작동하지만 Windows에서는 작동하지 않습니다. 튜토리얼을 다시 시작하여 뭔가를 놓치지 않고 모든 이전 자습서가 제대로 작동하는지 확인했지만 동일한 결과를 얻습니다. 그냥 제대로 렌더링되지 않습니다. Windows의 Visual Studio 2015에서이 작업을 수행했습니다. Mac에서는 vim과 Makefile을 사용하여 작업 할 수있게되었지만 컴파일 할 때 IDE를 사용하는 것이 더 쉬울 것이라고 생각했지만 실제로는 그렇지 않습니다.OpenGL 3D 큐브가 Windows에서 올바르게 렌더링되지 않습니다.

the rendered cube

이 내 화면에 표시되는 내용입니다 만 정말 빠르게 깜박 대신 내가 점점되어야한다 회전하는 큐브의, 많은 이동합니다.

Shader.h :

#ifndef SHADER_H 
#define SHADER_H 

#include <string> 
#include <fstream> 
#include <sstream> 
#include <iostream> 

#include <GL/glew.h> 

class Shader 
{ 
public: 
    GLuint Program; 
    // Constructor generates the shader on the fly 
    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 Use() 
    { 
     glUseProgram(this->Program); 
    } 
}; 

#endif 

core.frag :

#version 330 core 
in vec2 TexCoord; 

out vec4 color; 

uniform sampler2D ourTexture1; 

void main() 
{ 
    color = texture(ourTexture1, TexCoord); 
} 

core.vs :

#version 330 core 
layout (location = 0) in vec3 position; 
layout (location = 2) in vec2 texCoord; 

out vec2 TexCoord; 

uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 

void main() 
{ 
    gl_Position = projection * view * model * vec4(position, 1.0f); 
    TexCoord = vec2(texCoord.x, 1.0 - texCoord.y); 
} 

MAIN.CPP 여기

코드이다 :

#include <iostream> 

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

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

// Other Libs 
#include "SOIL2/SOIL2.h" 

#include <glm/glm.hpp> 
#include <glm/gtc/matrix_transform.hpp> 
#include <glm/gtc/type_ptr.hpp> 

// Other includes 
#include "Shader.h" 

// Window dimensions 
const GLuint WIDTH = 800, HEIGHT = 600; 

// The MAIN function, from here we start the application and run the game loop 
int main() 
{ 
    // Init GLFW 
    glfwInit(); 

    // Set all the required options for GLFW 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    // Create a GLFWwindow object that we can use for GLFW's functions 
    GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); 

    int screenWidth, screenHeight; 
    glfwGetFramebufferSize(window, &screenWidth, &screenHeight); 

    if (nullptr == window) 
    { 
     std::cout << "Failed to create GLFW window" << std::endl; 
     glfwTerminate(); 

     return EXIT_FAILURE; 
    } 

    glfwMakeContextCurrent(window); 

    // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions 
    glewExperimental = GL_TRUE; 
    // Initialize GLEW to setup the OpenGL Function pointers 
    if (GLEW_OK != glewInit()) 
    { 
     std::cout << "Failed to initialize GLEW" << std::endl; 
     return EXIT_FAILURE; 
    } 

    // Define the viewport dimensions 
    glViewport(0, 0, screenWidth, screenHeight); 

    glEnable(GL_DEPTH_TEST); 
    // enable alpha support 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);//enables jpegs and alphas 

    // Build and compile our shader program 
    Shader ourShader("res/shaders/core.vs", "res/shaders/core.frag"); 

    // use with Perspective Projection 
    GLfloat vertices[] = { 
     //x  y  z  normalized texture coordinates 
     -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 
     0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 
     0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
     0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
     -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 
     -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 

     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 
     0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 
     0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 
     0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 
     -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 
     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 

     -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 
     -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 
     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 
     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 
     -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 

     0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 
     0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
     0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 
     0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 
     0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 
     0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 

     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 
     0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 
     0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 
     0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 
     -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 
     -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 

     -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 
     0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 
     0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 
     0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 
     -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 
     -0.5f, 0.5f, -0.5f, 0.0f, 1.0f 
    }; 

    GLuint VBO, VAO;//Vertex Buffer Object, Vertex Array Object 
    glGenVertexArrays(1, &VAO); 
    glGenBuffers(1, &VBO); 

    // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s). 
    glBindVertexArray(VAO); 

    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    // Position attribute 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid *)0); 
    glEnableVertexAttribArray(0); 
    // TexCoord attribute 
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid *)(3 * sizeof(GLfloat))); 
    glEnableVertexAttribArray(2); 

    glBindVertexArray(0); // Unbind VAO 

    // Load and create a texture 
    GLuint texture; 

    int width, height; 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    // Set our texture parameters 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    // Set texture filtering 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    // Load, create texture and generate mipmaps 
    unsigned char *image = SOIL_load_image("res/images/image1.jpg", &width, &height, 0, SOIL_LOAD_RGBA); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); 
    glGenerateMipmap(GL_TEXTURE_2D); 
    SOIL_free_image_data(image); 
    glBindTexture(GL_TEXTURE_2D, 0); 


    glm::mat4 projection; 
    projection = glm::perspective(45.0f, (GLfloat)screenWidth/(GLfloat)screenHeight, 0.1f, 1000.0f); 

    // Game loop 
    while (!glfwWindowShouldClose(window)) 
    { 
     // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions 
     glfwPollEvents(); 

     // Render 
     // Clear the colorbuffer 
     glClearColor(0.9f, 0.5f, 0.3f, 1.0f); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


     glActiveTexture(GL_TEXTURE0); 
     glBindTexture(GL_TEXTURE_2D, texture); 
     glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture"), 0); 
     ourShader.Use(); 

     glm::mat4 model; 
     glm::mat4 view; 
     model = glm::rotate(model, (GLfloat)glfwGetTime() * 1.0f, glm::vec3(0.5f, 1.0f, 0.0f)); 
     view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f)); 

     GLint modelLoc = glGetUniformLocation(ourShader.Program, "model"); 
     GLint viewLoc = glGetUniformLocation(ourShader.Program, "view"); 
     GLint projLoc = glGetUniformLocation(ourShader.Program, "projection"); 

     glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); 
     glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); 
     glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection)); 

     glBindVertexArray(VAO); 
     glDrawArrays(GL_TRIANGLES, 0, 36); 
     glBindVertexArray(0); 

     // Swap the screen buffers 
     glfwSwapBuffers(window); 
    }  

    // Properly de-allocate all resources once they've outlived their purpose 
    glDeleteVertexArrays(1, &VAO); 
    glDeleteBuffers(1, &VBO); 

    // Terminate GLFW, clearing any resources allocated by GLFW. 
    glfwTerminate(); 

    return EXIT_SUCCESS; 
} 
+0

매 통화마다 glGetError()를 확인 했습니까? – Robinson

+0

예상되는 쉐이더 코드가로드되었는지 확인 했습니까? 파일 "res/shaders/core.vs"와 "res/shaders/core.frag"가 적절한 쉐이더 파일입니까? (파일 이름 만 검사하지 말고 볼륨에있는 파일의 내용도 확인하십시오.) – Rabbid76

+0

@ Rabbid76 그래,로드되었는지 확인했습니다. – questions

답변

4

텍스처 샘플러 유니폼의 이름을 쉐이더 것은 "ourTexture1"입니다 :

glGetUniformLocation(ourShader.Program, "ourTexture") 
:

uniform sampler2D ourTexture1; 

하지만 당신은 당신이 이름 "ourTexture"을 사용하는 텍스처 샘플러 유니폼의 위치를 ​​확인하려고 할 때


두 번째 문제는 프로그램이 현재 렌더링 상태의 일부가되기 전에 텍스처 샘플러 유니폼을 ourTexture1으로 설정한다는 것입니다.

glUniform1i(glGetUniformLocation(ourShader.Program, "ourTexture"), 0); 
ourShader.Use(); 

유니폼의 위치는, 프로그램이 연결된 후에는 언제든지 (glLinkProgram)에서 (glGetUniformLocation)를 검색 할 수있다.

glLinkProgram(ourShader.Program); 

GLint modelLoc = glGetUniformLocation(ourShader.Program, "model"); 
GLint viewLoc = glGetUniformLocation(ourShader.Program, "view"); 
GLint projLoc = glGetUniformLocation(ourShader.Program, "projection"); 
GLint texLoc = glGetUniformLocation(ourShader.Program, "ourTexture1"); 

그러나 프로그램이 활성 프로그램 (glUseProgram)이 될 때까지 교복 (glUniform) 설정할 수 없습니다.

glUseProgram(ourShader.Program); 

glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); 
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); 
glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection)); 
glUniform1i(texLoc, 0); 
+0

이 모든 필요한 변경을가했지만 여전히 동일한 결과를 나타냅니다. – questions

+0

@questions 코드를 복사하고 테스트 했으므로 문제가 없습니다. – Rabbid76

+0

@questions로드 할 때 문제가있을 수 있습니다. [** this **] (https://ideone.com/DIiWsD) (코드에 붙여 넣기 복사)를 시도해 볼 수 있습니까?이 코드는 비트 맵을로드하지 않으며 DOS는'SOIL_load_image'를 사용하지 않지만 이미지를 동적으로. – Rabbid76

2

쉐이더를 활성화하기 전에 쉐이더를 유니폼으로 설정하는 것은 잘못된 것처럼 보입니다. 조각에서

관련 문제