最後に、シェーダーがコンパイルに失敗することに慣れていないという問題を特定しました。
これが私のシェーダー読み込みルーチンです。最初の部分は、シェーダーで読み取ります。
void GLSLShader::LoadFromFile(GLenum whichShader, const string filename)
{
ifstream fp;
// Attempt to open the shader
fp.open(filename.c_str(), ios_base::in);
// If the file exists, load it
if(fp)
{
// Copy the shader into the buffer
string buffer(std::istreambuf_iterator<char>(fp), (std::istreambuf_iterator<char>()));
// Debug output to show full text of shader
errorLog.writeSuccess("Shader debug: %s", buffer.c_str());
LoadFromString(whichShader, buffer);
}
else
{
errorLog.writeError("Could not load the shader %s", filename.c_str());
}
}
それを文字列にロードした後、それを送信してロードします。
void GLSLShader::LoadFromString(GLenum type, const string source)
{
// Create the shader
GLuint shader = glCreateShader(type);
// Convert the string
const char * ptmp = source.c_str();
glShaderSource(shader, 1, &ptmp, NULL);
// Compile the shader
glCompileShader(shader);
// Check to see if the shader has loaded
GLint status;
glGetShaderiv (shader, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) {
GLint infoLogLength;
glGetShaderiv (shader, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar *infoLog= new GLchar[infoLogLength];
glGetShaderInfoLog (shader, infoLogLength, NULL, infoLog);
errorLog.writeError("could not compile: %s", infoLog);
delete [] infoLog;
}
_shaders[_totalShaders++]=shader;
}
「コンパイルできませんでした:」というデバッグ出力が表示され、エラー バッファが空になっているようです。これは、過去3日間私を夢中にさせてきました。誰かが私のエラーを見ますか?
非常に単純なシェーダーは次のとおりです。
#version 330
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
smooth out vec4 theColor;
void main()
{
gl_Position = position;
theColor = color;
}
#version 330
smooth in vec4 theColor;
out vec4 outputColor;
void main()
{
outputColor = theColor;
}
アップデート
何らかの理由で、メモリ内のシェーダーの最後にがらくたが追加されているようです。理由はわかりません。char* と文字列に読み込もうとしました。出力は次のとおりです。
<-!-> Shader: #version 330
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
smooth out vec4 theColor;
void main()
{
gl_Position = position;
theColor = color;
}
n
<-!-> Shader: #version 330
smooth in vec4 theColor;
out vec4 outputColor;
void main()
{
outputColor = theColor;
}
nts/Resources
最初のシェーダーの末尾にある「n」と、2 番目のシェーダーの末尾にある「nts/Resources」に注目してください。理由はありますか?
別の更新
最後のがらくたは、最後の余分な行によって引き起こされました。それを削除したところ、正しいシェーダー テキストが出力されるようになりました。コンパイルに関してはまだ運がないと思います。
私はここで途方に暮れています。The Superbible には、最適化されていない膨大なライブラリがあり、私には必要ありません。Mac 用のまともなシェーダ コンパイラはないようです。私はそれがどれほど単純であるかを本当に気にしません。シェーダーで動作する必要があるだけです。誰にも例がありますか?