90 m_showBubbles = bubbles; |
90 m_showBubbles = bubbles; |
91 } |
91 } |
92 |
92 |
93 void GLWidget::paintQtLogo() |
93 void GLWidget::paintQtLogo() |
94 { |
94 { |
|
95 program1.enableAttributeArray(normalAttr1); |
|
96 program1.enableAttributeArray(vertexAttr1); |
95 program1.setAttributeArray(vertexAttr1, vertices.constData()); |
97 program1.setAttributeArray(vertexAttr1, vertices.constData()); |
96 program1.setAttributeArray(normalAttr1, normals.constData()); |
98 program1.setAttributeArray(normalAttr1, normals.constData()); |
97 glDrawArrays(GL_TRIANGLES, 0, vertices.size()); |
99 glDrawArrays(GL_TRIANGLES, 0, vertices.size()); |
98 program1.disableAttributeArray(normalAttr1); |
100 program1.disableAttributeArray(normalAttr1); |
99 program1.disableAttributeArray(vertexAttr1); |
101 program1.disableAttributeArray(vertexAttr1); |
157 }; |
159 }; |
158 program2.setAttributeArray(normalAttr2, afNormals, 3); |
160 program2.setAttributeArray(normalAttr2, afNormals, 3); |
159 |
161 |
160 program2.setUniformValue(textureUniform2, 0); // use texture unit 0 |
162 program2.setUniformValue(textureUniform2, 0); // use texture unit 0 |
161 |
163 |
|
164 program2.enableAttributeArray(vertexAttr2); |
|
165 program2.enableAttributeArray(normalAttr2); |
|
166 program2.enableAttributeArray(texCoordAttr2); |
|
167 |
162 glDrawArrays(GL_TRIANGLES, 0, 36); |
168 glDrawArrays(GL_TRIANGLES, 0, 36); |
163 |
169 |
164 program2.disableAttributeArray(vertexAttr2); |
170 program2.disableAttributeArray(vertexAttr2); |
165 program2.disableAttributeArray(normalAttr2); |
171 program2.disableAttributeArray(normalAttr2); |
166 program2.disableAttributeArray(texCoordAttr2); |
172 program2.disableAttributeArray(texCoordAttr2); |
171 glClearColor(0.1f, 0.1f, 0.2f, 1.0f); |
177 glClearColor(0.1f, 0.1f, 0.2f, 1.0f); |
172 |
178 |
173 glGenTextures(1, &m_uiTexture); |
179 glGenTextures(1, &m_uiTexture); |
174 m_uiTexture = bindTexture(QImage(":/qt.png")); |
180 m_uiTexture = bindTexture(QImage(":/qt.png")); |
175 |
181 |
176 QGLShader *vshader1 = new QGLShader(QGLShader::VertexShader, this); |
182 QGLShader *vshader1 = new QGLShader(QGLShader::Vertex, this); |
177 const char *vsrc1 = |
183 const char *vsrc1 = |
178 "attribute highp vec4 vertex;\n" |
184 "attribute highp vec4 vertex;\n" |
179 "attribute mediump vec3 normal;\n" |
185 "attribute mediump vec3 normal;\n" |
180 "uniform mediump mat4 matrix;\n" |
186 "uniform mediump mat4 matrix;\n" |
181 "varying mediump vec4 color;\n" |
187 "varying mediump vec4 color;\n" |
186 " vec3 col = vec3(0.40, 1.0, 0.0);\n" |
192 " vec3 col = vec3(0.40, 1.0, 0.0);\n" |
187 " color = vec4(col * 0.2 + col * 0.8 * angle, 1.0);\n" |
193 " color = vec4(col * 0.2 + col * 0.8 * angle, 1.0);\n" |
188 " color = clamp(color, 0.0, 1.0);\n" |
194 " color = clamp(color, 0.0, 1.0);\n" |
189 " gl_Position = matrix * vertex;\n" |
195 " gl_Position = matrix * vertex;\n" |
190 "}\n"; |
196 "}\n"; |
191 vshader1->compile(vsrc1); |
197 vshader1->compileSourceCode(vsrc1); |
192 |
198 |
193 QGLShader *fshader1 = new QGLShader(QGLShader::FragmentShader, this); |
199 QGLShader *fshader1 = new QGLShader(QGLShader::Fragment, this); |
194 const char *fsrc1 = |
200 const char *fsrc1 = |
195 "varying mediump vec4 color;\n" |
201 "varying mediump vec4 color;\n" |
196 "void main(void)\n" |
202 "void main(void)\n" |
197 "{\n" |
203 "{\n" |
198 " gl_FragColor = color;\n" |
204 " gl_FragColor = color;\n" |
199 "}\n"; |
205 "}\n"; |
200 fshader1->compile(fsrc1); |
206 fshader1->compileSourceCode(fsrc1); |
201 |
207 |
202 program1.addShader(vshader1); |
208 program1.addShader(vshader1); |
203 program1.addShader(fshader1); |
209 program1.addShader(fshader1); |
204 program1.link(); |
210 program1.link(); |
205 |
211 |
206 vertexAttr1 = program1.attributeLocation("vertex"); |
212 vertexAttr1 = program1.attributeLocation("vertex"); |
207 normalAttr1 = program1.attributeLocation("normal"); |
213 normalAttr1 = program1.attributeLocation("normal"); |
208 matrixUniform1 = program1.uniformLocation("matrix"); |
214 matrixUniform1 = program1.uniformLocation("matrix"); |
209 |
215 |
210 QGLShader *vshader2 = new QGLShader(QGLShader::VertexShader); |
216 QGLShader *vshader2 = new QGLShader(QGLShader::Vertex); |
211 const char *vsrc2 = |
217 const char *vsrc2 = |
212 "attribute highp vec4 vertex;\n" |
218 "attribute highp vec4 vertex;\n" |
213 "attribute highp vec4 texCoord;\n" |
219 "attribute highp vec4 texCoord;\n" |
214 "attribute mediump vec3 normal;\n" |
220 "attribute mediump vec3 normal;\n" |
215 "uniform mediump mat4 matrix;\n" |
221 "uniform mediump mat4 matrix;\n" |
220 " vec3 toLight = normalize(vec3(0.0, 0.3, 1.0));\n" |
226 " vec3 toLight = normalize(vec3(0.0, 0.3, 1.0));\n" |
221 " angle = max(dot(normal, toLight), 0.0);\n" |
227 " angle = max(dot(normal, toLight), 0.0);\n" |
222 " gl_Position = matrix * vertex;\n" |
228 " gl_Position = matrix * vertex;\n" |
223 " texc = texCoord;\n" |
229 " texc = texCoord;\n" |
224 "}\n"; |
230 "}\n"; |
225 vshader2->compile(vsrc2); |
231 vshader2->compileSourceCode(vsrc2); |
226 |
232 |
227 QGLShader *fshader2 = new QGLShader(QGLShader::FragmentShader); |
233 QGLShader *fshader2 = new QGLShader(QGLShader::Fragment); |
228 const char *fsrc2 = |
234 const char *fsrc2 = |
229 "varying highp vec4 texc;\n" |
235 "varying highp vec4 texc;\n" |
230 "uniform sampler2D tex;\n" |
236 "uniform sampler2D tex;\n" |
231 "varying mediump float angle;\n" |
237 "varying mediump float angle;\n" |
232 "void main(void)\n" |
238 "void main(void)\n" |
233 "{\n" |
239 "{\n" |
234 " highp vec3 color = texture2D(tex, texc.st).rgb;\n" |
240 " highp vec3 color = texture2D(tex, texc.st).rgb;\n" |
235 " color = color * 0.2 + color * 0.8 * angle;\n" |
241 " color = color * 0.2 + color * 0.8 * angle;\n" |
236 " gl_FragColor = vec4(clamp(color, 0.0, 1.0), 1.0);\n" |
242 " gl_FragColor = vec4(clamp(color, 0.0, 1.0), 1.0);\n" |
237 "}\n"; |
243 "}\n"; |
238 fshader2->compile(fsrc2); |
244 fshader2->compileSourceCode(fsrc2); |
239 |
245 |
240 program2.addShader(vshader2); |
246 program2.addShader(vshader2); |
241 program2.addShader(fshader2); |
247 program2.addShader(fshader2); |
242 program2.link(); |
248 program2.link(); |
243 |
249 |
282 modelview.rotate(m_fAngle, 0.0f, 0.0f, 1.0f); |
288 modelview.rotate(m_fAngle, 0.0f, 0.0f, 1.0f); |
283 modelview.scale(m_fScale); |
289 modelview.scale(m_fScale); |
284 modelview.translate(0.0f, -0.2f, 0.0f); |
290 modelview.translate(0.0f, -0.2f, 0.0f); |
285 |
291 |
286 if (qtLogo) { |
292 if (qtLogo) { |
287 program1.enable(); |
293 program1.bind(); |
288 program1.setUniformValue(matrixUniform1, modelview); |
294 program1.setUniformValue(matrixUniform1, modelview); |
289 paintQtLogo(); |
295 paintQtLogo(); |
290 program1.disable(); |
296 program1.release(); |
291 } else { |
297 } else { |
292 program2.enable(); |
298 program2.bind(); |
293 program1.setUniformValue(matrixUniform2, modelview); |
299 program1.setUniformValue(matrixUniform2, modelview); |
294 paintTexturedCube(); |
300 paintTexturedCube(); |
295 program2.disable(); |
301 program2.release(); |
296 } |
302 } |
297 |
303 |
298 glDisable(GL_DEPTH_TEST); |
304 glDisable(GL_DEPTH_TEST); |
299 glDisable(GL_CULL_FACE); |
305 glDisable(GL_CULL_FACE); |
300 |
306 |