Android Question OpenGL shader

MasterGy

Member
Licensed User
Hello!

I want to use OpenGL shader. For now, I want to be able to dynamically adjust the brightness/contrast of the output image. chatgpt created a SHADER class module for me, which I call from the rendering code module, and pass the 'gl' variable, which is the current instance of opengl. Unfortunately, I can't solve it. It doesn't work. The program can't find the objects during runtime.

I don't know where I'm going wrong. The code is syntactically correct, but I'm making a mistake.

shader class-code:
Sub Class_Globals
    Private gl As JavaObject
    Private program As Int
End Sub

' Public Sub Initialize(g As GL10) helyett most már JavaObject-et fogadunk
Public Sub Initialize(g As JavaObject)
    gl = g
    program = CreateShaderProgram
End Sub

' Aktiválja a shadert, és frissíti a uniform értékeket (kontraszt, fényerő)
Public Sub Use(contrast As Float, brightness As Float)
    ' Aktiválja a shadert
    gl.RunMethod("glUseProgram", Array(program))
    
    ' Uniform változók helyének lekérése
    Dim uContrast As Int = gl.RunMethod("glGetUniformLocation", Array(program, "u_Contrast"))
    Dim uBrightness As Int = gl.RunMethod("glGetUniformLocation", Array(program, "u_Brightness"))
    
    ' Uniform változók beállítása
    gl.RunMethod("glUniform1f", Array(uContrast, contrast))
    gl.RunMethod("glUniform1f", Array(uBrightness, brightness))
End Sub

Public Sub GetProgram As Int
    Return program
End Sub

' ====== Shader fordítás és linkelés ======
Private Sub CreateShaderProgram As Int
    ' Vertex és fragment shaderek lefordítása
    Dim vertexShader As Int = CompileShader(GLES20_GL_VERTEX_SHADER, VertexShaderSource)
    Dim fragmentShader As Int = CompileShader(GLES20_GL_FRAGMENT_SHADER, FragmentShaderSource)
    
    ' Shader program létrehozása és csatolása
    Dim programID As Int = gl.RunMethod("glCreateProgram", Null)
    gl.RunMethod("glAttachShader", Array(programID, vertexShader))
    gl.RunMethod("glAttachShader", Array(programID, fragmentShader))
    gl.RunMethod("glLinkProgram", Array(programID))
    
    Return programID


End Sub

Private Sub CompileShader(shaderType As Int, shaderCode As String) As Int
    ' Shader fordítása
    Dim shader2 As Int = gl.RunMethod("glCreateShader", Array(shaderType))
    gl.RunMethod("glShaderSource", Array(shader2, shaderCode))
    gl.RunMethod("glCompileShader", Array(shader2))
    Return shader2
End Sub

' ====== GLSL Vertex Shader ======
Private Sub VertexShaderSource As String
    Return $"attribute vec4 a_Position;
             attribute vec2 a_TexCoord;
             varying vec2 v_TexCoord;
             void main() {
                 gl_Position = a_Position;
                 v_TexCoord = a_TexCoord;
             }"$
End Sub

' ====== GLSL Fragment Shader ======
Private Sub FragmentShaderSource As String
    Return $"precision mediump float;
             uniform sampler2D u_Texture;
             uniform float u_Contrast;
             uniform float u_Brightness;
             varying vec2 v_TexCoord;
             void main() {
                 vec4 color = texture2D(u_Texture, v_TexCoord);
                 color.rgb += u_Brightness;
                 color.rgb = ((color.rgb - 0.5) * u_Contrast) + 0.5;
                 gl_FragColor = color;
             }"$
End Sub

' ====== GLES2 konstansok ======
Private Sub GLES20_GL_VERTEX_SHADER As Int
    Return 35633  ' Vertex shader típus
End Sub

Private Sub GLES20_GL_FRAGMENT_SHADER As Int
    Return 35632  ' Fragment shader típus
End Sub


This is how I call it from the renderer

call from render:
'shader
    Dim joGL As JavaObject = gl  ' gl is your GL1 copy
    'shader.Initialize(joGL)
    
    Dim shader2 As shader
    shader2.Initialize(joGL)  ' GL1 type from GLSurfaceView
    
    
    shader2.Use(.5, .5)  'brightness/contrast
 
Top