2013-06-28 2 views
1

"OpenGL Redbook"의 첫 번째 예제를 작성하려고합니다. 글쎄, 나만인가, 아니면 타사 LoadShaders가 고장 났는가?OpenGL 레드 북 - LoadShaders가 고장 났습니까?

오류 LNK2001 : 확인되지 않은 외부 기호 _LoadShaders

할 수있는 어떤 단서

...

+0

당신이 무슨 일을하는지 명확하지 않다. 분명히 _LoadShaders는 존재하지 않거나 링크되지 않습니다. – Robinson

+0

http://www.glprogramming.com/red/에서와 같이? 첫 번째 장과 첫 번째 예제? – Derek

+1

시작하기 훨씬 쉬운 최신판. 모든 다운 득표는 어리 석다. 다운로드 한 샘플 코드는 1 장과 2 장을 포함하지 않습니다. loadshaders.cpp와 헤더 파일은 재미있는 장소에 있습니다 (내가 기억하는 lib 디렉토리 중 하나). –

답변

1

프로젝트/편집에 oglpg-8-판/lib에 위치한 LoadShaders.cpp을 추가합니다. 그래도 행운을 빈다. 컴파일과 링크를 마침내 얻은 후에는 아직 예제가 제대로 작동하지 않습니다. 당신은 "여기에 코드가 있습니다"보다는 몇 가지 지침을 포함한다고 생각할 것입니다.

0

은 또한 당신이 설명하는 동일한 문제 ...

당신은 주위에 당신의 쉐이더를로드하는 작업으로 사용할 수 있었다!

매개 변수는 책과 다르지만 작동합니다. 정점 및 조각 셰이더 코드를 main.cpp가있는 텍스트 파일에 넣은 다음 Shader 개체를 인스턴스화하고 .LoadShader (vertexShaderFileName, fragmentShaderFileName);

헤더 :

#pragma once 
#include <vgl.h> 
#include <string> 
using namespace std; 

class Shader 
{ 
public: 
    Shader(void); 
    ~Shader(void); 

    GLuint LoadShader(const char* vertPath, const char* fragPath); 
private: 
    string ReadFile(const char* path); 
}; 

CPP :

#include "Shader.h" 
#include <iostream> 
#include <fstream> 
#include <vector> 

Shader::Shader(void) { 
} 


Shader::~Shader(void) { 
} 

// read a file and return as a string 
string Shader::ReadFile(const char* path) { 
    string content; 
    ifstream fileStream(path, ios::in); 

    if (!fileStream.is_open()) { 
     cerr << "File could not be opened" << endl; 
     return ""; 
    } 

    string line = ""; 
    while (!fileStream.eof()) { 
     getline(fileStream, line); 
     content.append(line + "\n"); 
    } 

    fileStream.close(); 
    return content; 
} 

GLuint Shader::LoadShader(const char* vertPath, const char* fragPath) { 
    //generate shader names 
    GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); 
    GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER); 

    //get shader src 
    string vertShaderStr = ReadFile(vertPath); 
    string fragShaderStr = ReadFile(fragPath); 

    const char* vertShaderSrc = vertShaderStr.c_str(); 
    const char* fragShaderSrc = fragShaderStr.c_str(); 

    GLint result = GL_FALSE; 
    int logLength; 

    //compile vertex shader 
    glShaderSource(vertShader, 1, &vertShaderSrc, NULL); 
    glCompileShader(vertShader); 
    glGetShaderiv(vertShader, GL_COMPILE_STATUS, &result); 
    glGetShaderiv(vertShader, GL_INFO_LOG_LENGTH, &logLength); 
    vector<char> vertShaderError(logLength); 
    glGetShaderInfoLog(vertShader, logLength, NULL, &vertShaderError[0]); 
    cout << &vertShaderError[0] << endl; 

    //compile fragment shader 
    glShaderSource(fragShader, 1, &fragShaderSrc, NULL); 
    glCompileShader(fragShader); 
    glGetShaderiv(fragShader, GL_COMPILE_STATUS, &result); 
    glGetShaderiv(fragShader, GL_INFO_LOG_LENGTH, &logLength); 
    vector<char> fragShaderError(logLength); 
    glGetShaderInfoLog(fragShader, logLength, NULL, &fragShaderError[0]); 
    cout << &fragShaderError[0] << endl; 

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

    glGetProgramiv(program, GL_LINK_STATUS, &result); 
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength); 
    vector<char> programError(logLength > 1 ? logLength : 1); 
    glGetProgramInfoLog(program, logLength, NULL, &programError[0]); 
    cout << &programError[0] << endl; 

    glDeleteShader(vertShader); 
    glDeleteShader(fragShader); 

    return program; 
} 
관련 문제