2012-12-19 31 views
1
  1. 我有一個適用於iOS應用程序的渲染引擎。
  2. 我幾乎設法通過調用與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"; 

回答

0

終於解決了這個問題!

我保留了#version 120,發現它缺少它的工作方式,因爲它在設備上工作。 在桌面上使用qt(現在5.0),您必須激活以下似乎在iOS上默認使用的gl函數:

glEnable(GL_POINT_SPRITE); 
    glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);