C++ OpenGL着色器加载失败
我的着色器加载代码有问题。奇怪的是,让我困惑的是,它可能每5次工作一次,但只有一种工作。例如,它将加载frag着色器,但随后纹理将无法正常工作(它将在几何体上绘制纹理的奇怪外观)。我认为问题在于加载代码,所以这就是我的问题所在。有人能发现我在下面的代码中没有发现的错误吗C++ OpenGL着色器加载失败,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我的着色器加载代码有问题。奇怪的是,让我困惑的是,它可能每5次工作一次,但只有一种工作。例如,它将加载frag着色器,但随后纹理将无法正常工作(它将在几何体上绘制纹理的奇怪外观)。我认为问题在于加载代码,所以这就是我的问题所在。有人能发现我在下面的代码中没有发现的错误吗 char* vs, * fs; vertexShaderHandle = glCreateShader(GL_VERTEX_SHADER); fragmentShaderHandle = glCreateShader(GL
char* vs, * fs;
vertexShaderHandle = glCreateShader(GL_VERTEX_SHADER);
fragmentShaderHandle = glCreateShader(GL_FRAGMENT_SHADER);
long sizeOfVShaderFile = getSizeOfFile(VERTEX_SHADER_FILE_NAME);
long sizeOfFShaderFile = getSizeOfFile(FRAGMENT_SHADER_FILE_NAME);
if(sizeOfVShaderFile == -1)
{
cerr << VERTEX_SHADER_FILE_NAME<<" is null! Exiting..." << endl;
return;
}
if(sizeOfFShaderFile == -1)
{
cerr << FRAGMENT_SHADER_FILE_NAME<<" is null! Exiting..." << endl;
return;
}
vs = readFile(VERTEX_SHADER_FILE_NAME);
fs = readFile(FRAGMENT_SHADER_FILE_NAME);
const char* vv = vs, *ff = fs;
glShaderSource(vertexShaderHandle , 1, &vv, NULL);
cout << "DEBUGGING SHADERS" << endl;
cout << "VERTEX SHADER: ";
printShaderInfoLog(vertexShaderHandle);
cout << endl;
glShaderSource(fragmentShaderHandle, 1, &ff, NULL);
cout << "FRAGMENT SHADER: ";
printShaderInfoLog(fragmentShaderHandle);
cout << endl;
glCompileShader(vertexShaderHandle);
cout << "VERTEX SHADER: ";
printShaderInfoLog(vertexShaderHandle);
cout << endl;
glCompileShader(fragmentShaderHandle);
cout << "FRAGMENT SHADER: ";
printShaderInfoLog(fragmentShaderHandle);
cout << endl;
programHandle = glCreateProgram();
cout << "DEBUGGING PROGRAM" << endl;
glAttachShader(programHandle, vertexShaderHandle);
printProgramInfoLog(programHandle);
glAttachShader(programHandle, fragmentShaderHandle);
printProgramInfoLog(programHandle);
glLinkProgram(programHandle);
printProgramInfoLog(programHandle);
glUseProgram(programHandle);
printProgramInfoLog(programHandle);
delete[] vs; delete[] fs;
以下所有消息都来自完全相同的可执行文件(无重建)
以下是第一条可能的错误消息:
BallGLWidget::initializeGL called
DEBUGGING SHADERS
VERTEX SHADER:
FRAGMENT SHADER:
VERTEX SHADER: ERROR: 0:17: '<' : syntax error syntax error
FRAGMENT SHADER:
DEBUGGING PROGRAM
ERROR: One or more attached shaders not successfully compiled
ERROR: One or more attached shaders not successfully compiled
glGetError enum value: GL_NO_ERROR
BallGLWidget::initializeGL called
DEBUGGING SHADERS
VERTEX SHADER:
FRAGMENT SHADER:
VERTEX SHADER: ERROR: 0:17: 'tt' : syntax error syntax error
FRAGMENT SHADER: ERROR: 0:33: '?' : syntax error syntax error
DEBUGGING PROGRAM
ERROR: One or more attached shaders not successfully compiled
ERROR: One or more attached shaders not successfully compiled
这是它工作时的输出(可能是五分之一或六分之一)
我真的很怀疑着色器本身,因为它们有时确实工作。。。报告的错误是垃圾
如果有更多的信息会有帮助,我很乐意提供
编辑:这是着色器
顶点着色器:
attribute vec2 a_v_position;
attribute vec2 a_tex_position;
varying vec2 tex_coord_output;
void main()
{
tex_coord_output = a_tex_position;
gl_Position = vec4(a_v_position, 0.0, 1.0);
}
片段着色器:
varying vec2 tex_coord_output;
uniform sampler2D ballsampler;
void main()
{
gl_FragColor = texture2D(ballsampler, tex_coord_output);
}
你正在读文件,但据我所知,你不是零终止文本。尝试分配filesize+1,并将最后一个字符设置为零。您的问题与的问题重复,下面是我的问题:
<>你使用C++,所以我建议你用它。与其读入自分配的字符数组,我建议您读入std::string:
#include <string>
#include <fstream>
std::string loadFileToString(char const * const fname)
{
std::ifstream ifile(fname);
std::string filetext;
while( ifile.good() ) {
std::string line;
std::getline(ifile, line);
filetext.append(line + "\n");
}
return filetext;
}
我们可以看看实际的着色器吗?当然,我在一个编辑器中发布了它们。您可以检查ifstream.read()调用的返回值,以确保您正在读取的数据是实际数据,并且不会因为某种原因而失败吗?您的初始化乍一看似乎是正确的,错误似乎表明它可能正在从流中读取垃圾数据(将仔细检查您的代码,以防我在这个假设中出错),谢谢!就这样!太好了,我从没想过。要么零终止,要么向glShaderSource提供数据长度。嘿,非常感谢您提供的代码片段!帮我省了一大笔工作!
varying vec2 tex_coord_output;
uniform sampler2D ballsampler;
void main()
{
gl_FragColor = texture2D(ballsampler, tex_coord_output);
}
#include <string>
#include <fstream>
std::string loadFileToString(char const * const fname)
{
std::ifstream ifile(fname);
std::string filetext;
while( ifile.good() ) {
std::string line;
std::getline(ifile, line);
filetext.append(line + "\n");
}
return filetext;
}
void glcppShaderSource(GLuint shader, std::string const &shader_string)
{
GLchar const *shader_source = shader_string.c_str();
GLint const shader_length = shader_string.size();
glShaderSource(shader, 1, &shader_source, &shader_length);
}
void load_shader(GLuint shaderobject, char * const shadersourcefilename)
{
glcppShaderSource(shaderobject, loadFileToString(shadersourcefilename));
}