2013-06-28 146 views
1

我正在嘗試構建「OpenGL紅皮書」的第一個示例。 那麼,這只是我,還是他們的第三方LoadShaders壞了?OpenGL紅寶書 - LoadShaders壞了?

錯誤LNK2001:解析外部符號_LoadShaders

不知道該怎麼辦...

+0

不明確的,你在這裏做什麼。顯然_LoadShaders不存在,沒有被鏈接,或者其他什麼。 – Robinson

+0

正如http://www.glprogramming.com/red/?第一章和第一個例子? – Derek

+1

更近期的版本不太容易上手。所有的贊成票都是荒謬的。下載的示例代碼不包括第1章和第2章。loadshaders.cpp和頭文件位於一個有趣的地方(我記得是lib目錄之一)。 –

回答

1

添加LoadShaders.cpp,位於oglpg-8版/ lib目錄,你的項目/編譯。不過,祝你好運。一旦終於通過編譯和鏈接,我還沒有得到正確的例子。你會認爲他們會包含一些說明,而不僅僅是「這是代碼」。

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; 
}