前因
最近在嘗試使用Opengl ES實現一些LUT濾鏡效果,在實現這些濾鏡效果的時候遇到一些相容性的坑,踩過這些坑後我希望把這幾個坑分享給讀者朋友們,
希望同在學習Opengl ES的朋友們能少走彎路。
關於LUT濾鏡相關的介紹,也是這個Opengl ES系列入門教程的一項內容,在後面的文章中會專門介紹,這裡暫時不展開講解,後續大家敬請期待。
踩坑詳情
1、著色器編譯報錯
有以下這個片元著色器,在其他手機上正正常編譯,但是在華為鴻蒙系統上卻編譯報錯:
#version 300 es
precision mediump float;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform sampler3D textureLUT;
out vec4 FragColor;
void main()
{
vec4 color = texture(ourTexture, TexCoord);
FragColor = texture(textureLUT,color.rgb);
}
報錯內容:
no default precision defined for variable 'textureLUT'
很明顯說是沒有宣告精度的問題,然後在第二行不是已經使用precision mediump float;
宣告瞭精度了嗎?是的,這已經宣告瞭精度,但是這個宣告的精度是針對float型別的,
針對sampler3D型別的精度並沒有宣告,因此我們只需要宣告以下sampler3D的精度問題即可。下面是經過修改過的正確的著色器程式碼:
#version 300 es
precision mediump float;
in vec2 TexCoord;
uniform sampler2D ourTexture;
// 華為手機上必須加上highp,否則報錯no default precision defined for
uniform mediump sampler3D textureLUT;
out vec4 FragColor;
void main()
{
vec4 color = texture(ourTexture, TexCoord);
FragColor = texture(textureLUT,color.rgb);
}
2、glTexImage3D報錯GL_INVALID_OPERATION
使用以下程式碼上傳3DLut的cube紋理資料時,部分手機能正常工作,但是同樣在華為鴻蒙的手機上卻報錯,使用函式glGetError()
獲取到的錯誤是GL_INVALID_OPERATION
。
GLES30.glTexImage3D(
GL_TEXTURE_3D,
0,
GL_RGB,
size, size, size,
0,
GL_RGB,
GL_FLOAT,
lutBuffer
);
後來經過查閱資料發現是使用函式glTexImage3D
時的第三個引數傳遞錯誤所致的,將第三個引數GL_RGB
改為GLES30.GL_RGB16F
即可,正確的程式碼如下:
GLES30.glTexImage3D(
GL_TEXTURE_3D,
0,
// 鴻蒙等要用GLES30.GL_RGB16F, 小米等其他手機可用GL_RGB
GLES30.GL_RGB16F,
size, size, size,
0,
GL_RGB,
GL_FLOAT,
lutBuffer
);
GLES30.GL_RGB16F格式是浮點幀緩衝的相關內容,當幀緩衝使用了一個標準化的定點格式(像GL_RGB)為其顏色緩衝的內部格式,OpenGL會在將這些值存入幀緩衝前自動將其約束到0.0到1.0之間。
當一個幀緩衝的顏色緩衝的內部格式被設定成了GL_RGB16F,GL_RGBA16F,GL_RGB32F或者GL_RGBA32F時,這些幀緩衝被叫做浮點幀緩衝(Floating Point Framebuffer),浮點幀緩衝可以儲存超過0.0到1.0範圍的浮點值。
Opengl ES系列入門介紹
Opengl ES之EGL環境搭建
Opengl ES之著色器
Opengl ES之三角形繪製
Opengl ES之四邊形繪製
Opengl ES之紋理貼圖
Opengl ES之VBO和VAO
Opengl ES之EBO
Opengl ES之FBO
Opengl ES之PBO
Opengl ES之YUV資料渲染
YUV轉RGB的一些理論知識
Opengl ES之RGB轉NV21
關注我,一起進步,人生不止coding!!!