Я пытаюсь создать приложение для создания реактивного ранца с помощью шейдера glsl (я знаю, что AGSL существует, но для моего проекта я должен работать с glsl). Благодаря текущему прогрессу я могу правильно создавать шейдеры, но я также хочу иметь возможность передавать растровые изображения в качестве текстур. Это код рендерера
список текстур содержит имя текстуры с соответствующим растровым изображением.< /li>
названия текстур присутствуют во фрагментном шейдере.
помощь ИИ< /p>
chat gpt написал этот код, который работает, но только для одной текстуры, а не для нескольких текстур. В моей собственной реализации я просто добавил способ передачи различных данных в шейдер и обеспечения их совместимости с различными модулями моего приложения.
Я пытаюсь создать приложение для создания реактивного ранца с помощью шейдера glsl (я знаю, что AGSL существует, но для моего проекта я должен работать с glsl). Благодаря текущему прогрессу я могу правильно создавать шейдеры, но я также хочу иметь возможность передавать растровые изображения в качестве текстур. [b]Это код рендерера[/b] [code]import android.content.ContentResolver import android.graphics.Bitmap import android.opengl.GLES20 import android.opengl.GLSurfaceView import android.opengl.GLUtils import androidx.compose.ui.geometry.Offset import com.dhruv.angular_launcher.core.resources.AllResources import com.dhruv.angular_launcher.core.resources.ShaderData import com.dhruv.angular_launcher.core.resources.textureBitmaps import com.dhruv.angular_launcher.utils.ScreenUtils import java.nio.ByteBuffer import java.nio.ByteOrder import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10 import kotlin.math.min
class MyGLRenderer( contentResolver: ContentResolver, val shaderData: ShaderData, ) : GLSurfaceView.Renderer {
private fun setupShader() { val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode) val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode)
program = GLES20.glCreateProgram().also { GLES20.glAttachShader(it, vertexShader) GLES20.glAttachShader(it, fragmentShader) GLES20.glLinkProgram(it) }
for (i in textures.indices) { val bitmap = textures[i].second GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureIds[i]) GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0) GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR) GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR) } }
override fun onDrawFrame(gl: GL10?) { GLES20.glDisable(GL10.GL_DITHER) GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT or GLES20.GL_DEPTH_BUFFER_BIT)
if (uniformLocations.containsKey(AllResources.Frame.name)){ GLES20.glUniform1i(uniformLocations[AllResources.Frame.name]!!, frame) frame += 1 } uniformLocations.forEach{(key, location) -> location?.let { l -> uniformValues.getOrDefault(key, null)?.let { value -> insertData(l, value) } } }
for (i in textures.indices) { GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i) GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureIds[i]) GLES20.glUniform1i(GLES20.glGetUniformLocation(program, textures[i].first), i) println("name: ${textures[i].first} location: ${GLES20.glGetUniformLocation(program, textures[i].first)}, id: ${textureIds[i]}") } drawTexture() }
private fun insertData(l: Int, value: Any){ if (value is Float) GLES20.glUniform1f(l, value) if (value is FloatArray) { when (value.size) { 1 -> {GLES20.glUniform1f(l, value[0])} 2 -> {GLES20.glUniform2f(l, value[0], value[1])} 3 -> {GLES20.glUniform3f(l, value[0], value[1], value[2])} 4 -> {GLES20.glUniform4f(l, value[0], value[1], value[2], value[3])} else -> {} } } if (value is Int) GLES20.glUniform1i(l, value) if (value is IntArray) { when (value.size) { 1 -> {GLES20.glUniform1i(l, value[0])} 2 -> {GLES20.glUniform2i(l, value[0], value[1])} 3 -> {GLES20.glUniform3i(l, value[0], value[1], value[2])} 4 -> {GLES20.glUniform4i(l, value[0], value[1], value[2], value[3])} 6 -> { GLES20.glUniform3i(l, value[0], value[1], value[2]) GLES20.glUniform3i(l+3, value[3], value[4], value[5]) } else -> {} } } if (value is Boolean) GLES20.glUniform1i(l, if (value) 1 else 0) if (value is List) { val len = value.size if (len > 0 && value[0] is Offset) { for (i in 0 until min(len, 100)) { val offset = value[i] as Offset GLES20.glUniform2f(l + i, offset.x, offset.y) } } if (len > 0 && value[0] is FloatArray) { if ((value[0] as FloatArray).size == 1) for (i in 0 until min(len, 100)) { val v = value[i] as FloatArray GLES20.glUniform1f(l + i, v[0]) } if ((value[0] as FloatArray).size == 2) for (i in 0 until min(len, 100)) { val v = value[i] as FloatArray GLES20.glUniform2f(l + i, v[0], v[1]) } if ((value[0] as FloatArray).size == 3) for (i in 0 until min(len, 100)) { val v = value[i] as FloatArray GLES20.glUniform3f(l + i, v[0], v[1], v[2]) } if ((value[0] as FloatArray).size == 4) for (i in 0 until min(len, 100)) { val v = value[i] as FloatArray GLES20.glUniform4f(l + i, v[0], v[1], v[2], v[3]) } } } }
private fun drawTexture() { GLES20.glUseProgram(program)
val positionHandle = GLES20.glGetAttribLocation(program, "aPosition") GLES20.glEnableVertexAttribArray(positionHandle)
val textureCoordHandle = GLES20.glGetAttribLocation(program, "aTexCoord") GLES20.glEnableVertexAttribArray(textureCoordHandle)
// Define vertices and texture coordinates here and pass them to OpenGL ES buffers // Example vertices and texture coordinates val vertices = floatArrayOf( -1.0f, 1.0f, // top left -1.0f, -1.0f, // bottom left 1.0f, -1.0f, // bottom right 1.0f, 1.0f // top right )
val textureCoords = floatArrayOf( 0.0f, 0.0f, // top left 0.0f, 1.0f, // bottom left 1.0f, 1.0f, // bottom right 1.0f, 0.0f // top right )
GLES20.glDisableVertexAttribArray(positionHandle) GLES20.glDisableVertexAttribArray(textureCoordHandle) } } [/code] [b]Это код glsl, который использует эти текстуры[/b] [code]#version 100 #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif
varying vec2 vTexCoord; uniform sampler2D TEX0;
void main() { vec4 color = texture2D(TEX0, vTexCoord); gl_FragColor = color; } [/code] [b]ПРИМЕЧАНИЕ[/b] [list] [*]список текстур содержит имя текстуры с соответствующим растровым изображением.< /li> названия текстур присутствуют во фрагментном шейдере. [/list] [b]помощь ИИ[/b]< /p> chat gpt написал этот код, который работает, но только для одной текстуры, а не для нескольких текстур. В моей собственной реализации я просто добавил способ передачи различных данных в шейдер и обеспечения их совместимости с различными модулями моего приложения. [code]import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.opengl.GLES20 import android.opengl.GLUtils import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10
class MyGLRenderer(private val context: Context) : GLSurfaceView.Renderer { private var textureHandle: Int = 0 private lateinit var bitmap: Bitmap
private fun setupShader() { val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode) val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode)
// Define vertices and texture coordinates here and pass them to OpenGL ES buffers
// Example vertices and texture coordinates val vertices = floatArrayOf( -1.0f, 1.0f, // top left -1.0f, -1.0f, // bottom left 1.0f, -1.0f, // bottom right 1.0f, 1.0f // top right )
val textureCoords = floatArrayOf( 0.0f, 0.0f, // top left 0.0f, 1.0f, // bottom left 1.0f, 1.0f, // bottom right 1.0f, 0.0f // top right )
GLES20.glDisableVertexAttribArray(positionHandle) GLES20.glDisableVertexAttribArray(textureCoordHandle) } } [/code] Если кто-то знает об этом, пожалуйста, помогите.
Во-первых, я полный нуб, когда дело касается шейдеров и GLSL. Итак, вот в чем дело:
Я пытаюсь проанализировать этот шейдер ShaderToy во фрагмент шейдера GLSL для использования внутри этой библиотеки GPUImage. Я использую этот файл в качестве образца...
Я хочу сделать шейдер для игры в пиксель, которая бы нарисовала спрайт с контуром, если его цвет фона совпадает с указанным цветом. Эта версия работает нормально (1-е фото):
#version 400 core
in vec2 TexCoords;
out vec4 color;
У меня есть зависимость от стороннего пакета, который не реализован в Jetpack Compose, поэтому я пытаюсь отобразить Fragment, используя предложенный Android подход с использованием AndroidFragment, но не могу этого сделать, так как постоянно получаю...
У меня есть зависимость от стороннего пакета, который не реализован в Jetpack Compose, поэтому я пытаюсь отобразить Fragment, используя предложенный Android подход с использованием AndroidFragment, но не могу этого сделать, так как постоянно получаю...