1
- 我有一個適用於iOS應用程序的渲染引擎。
- 我幾乎設法通過調用與QGLWidget qt(4.8)應用程序相同的OpenGL渲染引擎工作。爲了支持es2功能集,我的小部件也繼承了QGLFunctions。
但是我仍然遇到着色問題:由於幾乎所有關鍵字(lowp,vec4,vec2 ...)都返回了編譯錯誤,所以我無法在qt上使用glCompileShader編譯它們。所以我用QGLShader程序編譯它,但我必須指定「#version 120」,最接近es2。但是,我的精靈並沒有顯示出正確的大小,並且唯一可能影響iOS的代碼片段是在着色器編譯/版本中。我認爲着色器中的問題是gl_PointSize不會改變qt的頂點着色器編譯中的任何內容。如何讓qt中的着色器編譯並像es2(iOS)一樣工作?
有沒有更好的方法讓我像使用iOS一樣在qt上編譯着色器? (我知道glsl es2版本來自版本120,但我不知道它們在多大程度上不同)。
我着色器,iOS上的工作很好,但不是Qt的:
const GLchar vShaderStr[] =
#ifdef QT_OPENGL_LIB
"#version 120\n"
#endif //QT_OPENGL_LIB
"attribute lowp vec4 Position;\n"
"attribute mediump vec2 TextureCoord;\n"
"attribute lowp float Weight;\n"
"uniform mat4 MVP;\n"
"varying mediump vec2 TextureCoordOut;\n"
"void main(void)\n"
"{\n"
" gl_Position = MVP * Position;\n"
" TextureCoordOut = TextureCoord;\n"
" gl_PointSize = Weight;\n"
"}\n";
const GLchar fShaderStr[] =
#ifdef QT_OPENGL_LIB
"#version 120\n"
#endif //QT_OPENGL_LIB
"varying mediump vec2 TextureCoordOut;\n"
"uniform sampler2D Sampler;\n"
"uniform bool IsSprite;\n"
"uniform lowp vec3 TextureColor;\n"
"uniform lowp float Opacity;\n"
"void main(void)\n"
"{\n"
" lowp vec4 textureColorResult;\n"
" textureColorResult = texture2D(Sampler, IsSprite ? gl_PointCoord : TextureCoordOut);\n"
" gl_FragColor = IsSprite ? vec4(mix(textureColorResult.rgb,TextureColor, 1.0),\n"
" textureColorResult.a * Opacity) : textureColorResult;\n"
"}\n";