前言
本文将会记录笔者在学习 OpenGL ES 过程中,遇到的问题及解决问题的参考办法。同时也提供了一些 Debug 问题的分析思路和技巧。
以下代码基于
Kotlin
和C++
。
更新记录
日期 | 更新内容 |
---|---|
2022.01.16 | 新增 Debug 技巧 |
Debug 技巧
一、检查 Shader 创建问题
创建 Shader 的大致步骤如下:
// 创建一个 shader,并返回它的 handle
// 其中,输入参数 shaderType 为想创建的 shader 类型,
// 一般是 GLES30.GL_VERTEX_SHADER 或 GLES30.GL_FRAGMENT_SHADER
val shaderHandle = GLES30.glCreateShader(shadeType)
// 将预先准备好的源码与该 shader 绑定
GLES30.glShaderSource(shaderHandle, sourceCode)
// 编译 shader
GLES30.glCompileShader(shaderHandle)
一般,问题容易出现在 GLES30.glCompileShader()
阶段,极少情况下,GLES30.glCreateShader()
时会发生异常。
- shader 的 handle 一定是大于 0 的,可以用这一点来判断
glCreateShader()
是否发生异常。 - 可以用
GLES30.glGetShaderiv()
1 和GLES30.glGetShaderInfoLog()
2 来判断glCompileShader()
是否发生异常。
基于以上考虑,笔者将创建 shader 的过程封装成一个函数:
/**
* 创建 shader,并返回该 shader 的 handle
*
* @param shaderType 要创建的 shader 类型,通常为 GLES30.GL_VERTEX_SHADER
* 或 GLES30.GL_FRAGMENT_SHADER
* @param shaderCode 该 shader 的源码
* @return 该 shader 的 handle,正常情况一定大于 0,为 0 或者负数说明发生了错误!
*/
fun createShader(shaderType: Int, shaderCode: String): Int {
val shaderTypeStr = when (shaderType) {
GLES30.GL_VERTEX_SHADER -> "Vertex Shader"
GLES30.GL_FRAGMENT_SHADER -> "Fragment Shader"
else -> "Unsupported type"
}
// !!!注意!!!DEBUG 为笔者自己加的调试开关