Opengl ES之踩坑記

2023-02-15 12:01:07

前因

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