Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 顶点着色器错误C5145:必须使用QShaderProgram写入gl_位置_C++_Qt_Opengl_Glsl_Shader - Fatal编程技术网

C++ 顶点着色器错误C5145:必须使用QShaderProgram写入gl_位置

C++ 顶点着色器错误C5145:必须使用QShaderProgram写入gl_位置,c++,qt,opengl,glsl,shader,C++,Qt,Opengl,Glsl,Shader,我将VisualStudioC++ +代码> OpenGL 代码> 我已经翻译了所有的代码,我正在使用Qt类来实现OpenGLpart 我现在遇到的问题是,当我链接着色器程序时,它会抛出一个错误,显示: 顶点信息(0):错误C5145:必须写入gl_位置 我正在实现QOpenGLFunctions\u 4\u 1\u Core并调试编译函数,以查看代码是否可读性良好,是否正确 读取所有代码,编译函数返回true(编译良好) GLuint shaderProgram::createShaderP

我将VisualStudioC++ +代码> OpenGL UI >代码> 我已经翻译了所有的代码,我正在使用Qt类来实现
OpenGL
part

我现在遇到的问题是,当我链接
着色器程序时,它会抛出一个错误,显示:

顶点信息(0):错误C5145:必须写入gl_位置

我正在实现
QOpenGLFunctions\u 4\u 1\u Core
并调试编译函数,以查看代码是否可读性良好,是否正确

读取所有代码,编译函数返回true(编译良好)

GLuint shaderProgram::createShaderProgram(const char*fileName){
//Creamos el shader程序y almacenamos su Identificator
if(处理程序){
shaderP=新QOpenGLShaderProgram();
handler=shaderP->create();
if(!handler){
fprintf(stderr,“无法创建着色器程序:%s.\n”,文件名);
返回0;
}
}
//Cargamos y compileamos cada uno de los shader objects que componen este
//着色器程序
char filenameplete[256];
strcpy_s(文件名完成,文件名);
strcat_s(filenameplete,“-vert.glsl”);
QOpenGLShader*顶点=新的QOpenGLShader(QOpenGLShader::顶点);
GLuint vertexShaderObject=compileShader(fileNameComplete,QOpenGLShader::Vertex,Vertex);
如果(vertexShaderObject==0){
返回0;
}
strcpy_s(文件名完成,文件名);
strcat_s(文件名完整,“-frag.glsl”);
QOpenGLShader*fragment=新的QOpenGLShader(QOpenGLShader::fragment);
GLuint fragmentShaderObject=compileShader(fileNameComplete,QOpenGLShader::Fragment,Fragment);
如果(fragmentShaderObject==0){
返回0;
}
//Asociamos los着色器对象编译ADOS sin错误al着色器程序
shaderP->addShader(顶点);
shaderP->addShader(片段);
//Enlazamos el着色器程序y comprobamos si hay错误
handler=shaderP->link();//这里是抛出错误的地方
if(!handler)
{
QString error=shaderP->log();

std::cout代码中存在一些问题

首先,我向大家推荐:

e、 g

QOpenGLShader*顶点=新的QOpenGLShader(QOpenGLShader::顶点);
顶点->编译资源文件(文件名完成);

在函数
shaderProgram::compileShader
中,使用局部变量
shader

但是,指向该变量的指针被指定给输出参数
shaderComp

当函数终止时,本地对象
着色器
将被破坏,指针最终不会指向任何地方

该参数必须是输入参数。去掉局部变量并使用现有对象编译着色器。
您可以在
shaderProgram::compileShader
中创建一个新的
QOpenGLShader
对象,并通过返回值返回该对象:

QOpenGLShader*shaderProgram::compileShader(
常量字符*文件名,
QOpenGLShader::ShaderTypeBit类型)
{
//解决方案存在于递归建筑中
//你的名字是什么
如果(!fileExists(filename)){
fprintf(stderr,“未找到着色器源文件%s。\n”,文件名);
返回空ptr;
}
//现在,我们需要一个能容纳所有人的房间
//completo del着色器源
std::ifstream着色器源文件;
shaderSourceFile.open(文件名);
如果(!shaderSourceFile){
fprintf(stderr,“无法打开着色器源文件。\n”);
返回空ptr;
}
std::stringstream着色器资源流;
shaderSourceStream编译源代码(代码);
如果(!结果){
常量QString qs=shader->log();
std::cout logString=qs.toStdString();
删除着色器;
返回空ptr;
}
//si ha compilado bien,creamos el shader
返回着色器;
}
按如下方式调用该方法:

std::string vertFileName=std::string(fileName)+“-vert.glsl”;
QOpenGLShader*vertex=compileShader(vertFileName.c_str(),QOpenGLShader::vertex);
如果(!顶点){
返回0;
}
std::string fragFileName=std::string(文件名)+“-frag.glsl”;
QOpenGLShader*fragment=compileShader(fragFileName.c_str(),QOpenGLShader::fragment);
如果(!片段){
返回0;
}

问题是在你的GLSL着色器代码中(而不是上面列出的C++)。看到代码(FWW:错误是说你的顶点着色器代码不写入GLSL属性,这是按照GLSL规范所要求的)是有帮助的。@robthebloke可能是glsl代码中存在问题,但使用此代码不会成功链接任何着色器程序。这就是解决方案。谢谢!
QOpenGLShader shader(type);
shaderComp = &shader;