shader: vendor defines

This commit is contained in:
Bixilon 2021-06-13 13:47:40 +02:00
parent b6c1e56c3a
commit 1a249f0fcd
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
7 changed files with 45 additions and 15 deletions

View File

@ -21,6 +21,7 @@ class ShaderManager(
val renderWindow: RenderWindow,
) {
val genericColorShader = Shader(
renderWindow = renderWindow,
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "generic/color"),
)

View File

@ -46,7 +46,6 @@ import de.bixilon.minosoft.util.KUtil.nullCast
import de.bixilon.minosoft.util.KUtil.synchronizedMapOf
import de.bixilon.minosoft.util.KUtil.synchronizedSetOf
import de.bixilon.minosoft.util.KUtil.toSynchronizedMap
import de.bixilon.minosoft.util.MMath
import de.bixilon.minosoft.util.collections.SynchronizedMap
import de.bixilon.minosoft.util.task.ThreadPoolRunnable
import glm_.vec2.Vec2i
@ -176,8 +175,8 @@ class WorldRenderer(
override fun postInit() {
check(renderWindow.textures.animator.animatedTextures.size < TextureArray.MAX_ANIMATED_TEXTURE) { "Can not have more than ${TextureArray.MAX_ANIMATED_TEXTURE} animated textures!" }
chunkShader = Shader(
renderWindow = renderWindow,
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "chunk"),
defines = mapOf("ANIMATED_TEXTURE_COUNT" to MMath.clamp(renderWindow.textures.animator.animatedTextures.size, 1, TextureArray.MAX_ANIMATED_TEXTURE)),
)
chunkShader.load()

View File

@ -42,6 +42,7 @@ class HUDRenderer(val connection: PlayConnection, val renderWindow: RenderWindow
private val hudElements: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
private val enabledHUDElement: MutableMap<ResourceLocation, Pair<HUDElementProperties, HUDElement>> = mutableMapOf()
private val hudShader = Shader(
renderWindow = renderWindow,
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "hud"),
)
lateinit var hudAtlasElements: Map<ResourceLocation, HUDAtlasElement>

View File

@ -22,13 +22,11 @@ import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent
import de.bixilon.minosoft.gui.rendering.particle.types.Particle
import de.bixilon.minosoft.gui.rendering.shader.Shader
import de.bixilon.minosoft.gui.rendering.textures.Texture
import de.bixilon.minosoft.gui.rendering.textures.TextureArray
import de.bixilon.minosoft.modding.event.CallbackEventInvoker
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition
import de.bixilon.minosoft.util.KUtil.synchronizedSetOf
import de.bixilon.minosoft.util.KUtil.toSynchronizedSet
import de.bixilon.minosoft.util.MMath
import glm_.vec3.Vec3
import org.lwjgl.opengl.GL11.glDepthMask
@ -64,8 +62,8 @@ class ParticleRenderer(
override fun postInit() {
particleShader = Shader(
renderWindow = renderWindow,
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "particle"),
defines = mapOf("ANIMATED_TEXTURE_COUNT" to MMath.clamp(renderWindow.textures.animator.animatedTextures.size, 1, TextureArray.MAX_ANIMATED_TEXTURE)),
)
particleShader.load()
renderWindow.textures.use(particleShader)

View File

@ -18,9 +18,12 @@ import de.bixilon.minosoft.data.assets.AssetsManager
import de.bixilon.minosoft.data.commands.CommandStringReader
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.gui.rendering.RenderWindow
import de.bixilon.minosoft.gui.rendering.Rendering
import de.bixilon.minosoft.gui.rendering.exceptions.ShaderLoadingException
import de.bixilon.minosoft.gui.rendering.textures.TextureArray
import de.bixilon.minosoft.gui.rendering.util.OpenGLUtil
import de.bixilon.minosoft.util.MMath
import glm_.mat4x4.Mat4
import glm_.mat4x4.Mat4d
import glm_.vec2.Vec2
@ -37,6 +40,7 @@ import org.lwjgl.system.MemoryUtil
import java.io.FileNotFoundException
class Shader(
private val renderWindow: RenderWindow,
private val resourceLocation: ResourceLocation,
private val defines: Map<String, Any> = mapOf(),
) {
@ -47,9 +51,9 @@ class Shader(
fun load(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER): Int {
val uniforms: MutableList<String> = mutableListOf()
val pathPrefix = "${resourceLocation.namespace}:rendering/shader/${resourceLocation.path}/${resourceLocation.path.replace("/", "_")}"
val vertexShader = createShader(assetsManager, ResourceLocation("$pathPrefix.vsh"), GL_VERTEX_SHADER_ARB, defines, uniforms)!!
val geometryShader = createShader(assetsManager, ResourceLocation("$pathPrefix.gsh"), GL_GEOMETRY_SHADER_ARB, defines, uniforms)
val fragmentShader = createShader(assetsManager, ResourceLocation("$pathPrefix.fsh"), GL_FRAGMENT_SHADER_ARB, defines, uniforms)!!
val vertexShader = createShader(assetsManager, renderWindow, ResourceLocation("$pathPrefix.vsh"), GL_VERTEX_SHADER_ARB, defines, uniforms)!!
val geometryShader = createShader(assetsManager, renderWindow, ResourceLocation("$pathPrefix.gsh"), GL_GEOMETRY_SHADER_ARB, defines, uniforms)
val fragmentShader = createShader(assetsManager, renderWindow, ResourceLocation("$pathPrefix.fsh"), GL_FRAGMENT_SHADER_ARB, defines, uniforms)!!
this.uniforms = uniforms.toList()
programId = glCreateProgramObjectARB()
@ -160,9 +164,21 @@ class Shader(
companion object {
private val DEFAULT_DEFINES: Map<String, (renderWindow: RenderWindow) -> Any?> = mapOf(
"__NVIDIA" to {
if (glGetString(GL_VENDOR)?.lowercase()?.contains("nvidia") == true) {
""
} else {
null
}
},
"ANIMATED_TEXTURE_COUNT" to {
MMath.clamp(it.textures.animator.animatedTextures.size, 1, TextureArray.MAX_ANIMATED_TEXTURE)
}
)
private var currentShaderInUse: Shader? = null // ToDo: This is not safe todo
private fun createShader(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER, resourceLocation: ResourceLocation, shaderType: Int, defines: Map<String, Any>, uniforms: MutableList<String>): Int? {
private fun createShader(assetsManager: AssetsManager = Minosoft.MINOSOFT_ASSETS_MANAGER, renderWindow: RenderWindow, resourceLocation: ResourceLocation, shaderType: Int, defines: Map<String, Any>, uniforms: MutableList<String>): Int? {
val shaderId = glCreateShaderObjectARB(shaderType)
if (shaderId.toLong() == MemoryUtil.NULL) {
throw ShaderLoadingException()
@ -194,16 +210,25 @@ class Shader(
total.append(line)
total.append('\n')
fun pushDefine(name: String, value: Any) {
total.append("#define ")
total.append(name)
total.append(' ')
total.append(value)
total.append('\n')
}
when {
line.startsWith("#version") -> {
// add all defines
total.append('\n')
for ((define, value) in defines) {
total.append("#define ")
total.append(define)
total.append(' ')
total.append(value)
total.append('\n')
for ((name, value) in defines) {
pushDefine(name, value)
}
for ((name, value) in DEFAULT_DEFINES) {
value(renderWindow)?.let { pushDefine(name, it) }
}
}
line.startsWith("uniform ") -> { // ToDo: Packed in layout

View File

@ -41,9 +41,11 @@ class SkyRenderer(
val renderWindow: RenderWindow,
) : Renderer {
private val skyboxShader = Shader(
renderWindow = renderWindow,
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/skybox"),
)
private val skySunShader = Shader(
renderWindow = renderWindow,
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "sky/sun"),
)
private val skyboxMesh = SkyboxMesh()

View File

@ -15,6 +15,9 @@
uniform sampler2DArray uTextures[7];
vec4 getTexture(uint textureId, vec3 textureCoordinates) { // ToDo: This method is just stupid and workarounds a opengl crash with mesa drivers
#ifdef __NVIDIA
return texture(uTextures[textureId], textureCoordinates);
#else
switch (textureId) {
case 1u: return texture(uTextures[1], textureCoordinates);
case 2u: return texture(uTextures[2], textureCoordinates);
@ -24,4 +27,5 @@ vec4 getTexture(uint textureId, vec3 textureCoordinates) { // ToDo: This method
case 6u: return texture(uTextures[6], textureCoordinates);
}
return texture(uTextures[0], textureCoordinates);
#endif
}