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.
This is how I call it from the renderer
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