前因
最近在嘗試使用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!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/544073.html
標籤:Android
下一篇:Fragment回退堆疊相關操作
