Rad*_*ivu 2 c++ opengl qt glsl
我正在使用Qt编写游戏,我已经实现了一些后期处理着色器,使其看起来更有趣.它工作正常,直到我升级到linux mint 16,现在我总是得到一个需要精度说明符的错误,这只在编译片段着色器时才会发生.因为代码在android构建时编译并且工作正常,我认为这是因为QGLShaderProgram在桌面构建中编译时,将着色器添加mediump,highp和lowp作为着色器的开头.
所以我的问题是:有没有办法让glsl编译器停止需要精度说明符,或者我应该研究如何禁用这些定义被添加?
码:
isOk = m_displaceShader.addShaderFromSourceCode(QGLShader::Vertex,
"#version 100 \n"
"attribute mediump vec4 in_verts; \n"
"varying mediump vec2 out_tex; \n"
"void main(void) \n"
"{ \n"
" gl_Position = in_verts; \n"
" out_tex = (in_verts.xy + vec2(1.0)) * 0.5; \n"
"} \n");
qDebug() << m_displaceShader.log();
isOk &= m_displaceShader.addShaderFromSourceCode( QGLShader::Fragment,
"#version 100 \n"
"uniform sampler2D inCol; \n"
"uniform sampler2D inDisplace; \n"
"varying mediump vec2 out_tex; \n"
"void main(void) \n"
"{ \n"
" mediump vec4 displaceCol = texture2D(inDisplace, out_tex); \n"
" mediump float dispX = (displaceCol.r - 0.5) * 0.2; \n"
" mediump float dispY = (displaceCol.g - 0.5) * 0.2; \n"
" mediump vec2 texPlace = out_tex + vec2(dispX, dispY); \n"
" gl_FragColor = texture2D(inCol, texPlace); \n"
#ifdef DEBUG_SHADERS
" gl_FragColor = 0.5 * pow(texture2D(inCol, texPlace), vec4(1.0/2.2)) + 0.5 * displaceCol; \n"
#endif
"} \n"
);
Run Code Online (Sandbox Code Playgroud)
错误:
QGLShader::compile(Fragment): 0:7(16): error: no precision specified this scope for type `vec2'
0:10(9): error: no precision specified this scope for type `vec4'
0:11(10): error: no precision specified this scope for type `float'
0:12(10): error: no precision specified this scope for type `float'
0:13(9): error: no precision specified this scope for type `vec2'
Run Code Online (Sandbox Code Playgroud)
您正在使用#version 100
,这不是有效的桌面GLSL版本指令.请参阅GLSL 4.40规范中的以下引用(强调我的):
表示编译器不支持的语言版本的任何数字都将导致生成编译时错误.该语言的1.10版本不要求着色器包含此指令,并且不包含
#version
指令的着色器将被视为目标版本1.10.指定的着色器#version 100
将被视为OpenGL ES着色语言的目标版本1.00.
这是为了与GLES兼容,GLES SL需要这些精度说明符,因此您的编译器是正确的.
归档时间: |
|
查看次数: |
2421 次 |
最近记录: |