Cubyz/assets/cubyz/shaders/chunks/chunk_vertex.vs
IntegratedQuantum 9898db654b Specify the location of all shader in/out parameters.
also normalized the version and layout formatting
progress towards #1376
2025-05-02 14:53:57 +02:00

114 lines
2.8 KiB
GLSL

#version 460
layout(location = 0) out vec3 mvVertexPos;
layout(location = 1) out vec3 direction;
layout(location = 2) out vec3 light;
layout(location = 3) out vec2 uv;
layout(location = 4) flat out vec3 normal;
layout(location = 5) flat out int textureIndex;
layout(location = 6) flat out int isBackFace;
layout(location = 7) flat out int ditherSeed;
layout(location = 8) flat out float distanceForLodCheck;
layout(location = 9) flat out int opaqueInLod;
uniform vec3 ambientLight;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform ivec3 playerPositionInteger;
uniform vec3 playerPositionFraction;
struct FaceData {
int encodedPositionAndLightIndex;
int textureAndQuad;
};
layout(std430, binding = 3) buffer _faceData
{
FaceData faceData[];
};
struct QuadInfo {
vec3 normal;
vec3 corners[4];
vec2 cornerUV[4];
uint textureSlot;
int opaqueInLod;
};
layout(std430, binding = 4) buffer _quads
{
QuadInfo quads[];
};
layout(std430, binding = 10) buffer _lightData
{
uint lightData[];
};
struct ChunkData {
ivec4 position;
vec4 minPos;
vec4 maxPos;
int voxelSize;
uint lightStart;
uint vertexStartOpaque;
uint faceCountsByNormalOpaque[14];
uint vertexStartTransparent;
uint vertexCountTransparent;
uint visibilityState;
uint oldVisibilityState;
};
layout(std430, binding = 6) buffer _chunks
{
ChunkData chunks[];
};
void main() {
int faceID = gl_VertexID >> 2;
int vertexID = gl_VertexID & 3;
int chunkID = gl_BaseInstance;
int voxelSize = chunks[chunkID].voxelSize;
int encodedPositionAndLightIndex = faceData[faceID].encodedPositionAndLightIndex;
int textureAndQuad = faceData[faceID].textureAndQuad;
uint lightIndex = chunks[chunkID].lightStart + 4*(encodedPositionAndLightIndex >> 16);
uint fullLight = lightData[lightIndex + vertexID];
vec3 sunLight = vec3(
fullLight >> 25 & 31u,
fullLight >> 20 & 31u,
fullLight >> 15 & 31u
);
vec3 blockLight = vec3(
fullLight >> 10 & 31u,
fullLight >> 5 & 31u,
fullLight >> 0 & 31u
);
light = max(sunLight*ambientLight, blockLight)/31;
isBackFace = encodedPositionAndLightIndex>>15 & 1;
ditherSeed = encodedPositionAndLightIndex & 15;
textureIndex = textureAndQuad & 65535;
int quadIndex = textureAndQuad >> 16;
vec3 position = vec3(
encodedPositionAndLightIndex & 31,
encodedPositionAndLightIndex >> 5 & 31,
encodedPositionAndLightIndex >> 10 & 31
);
normal = quads[quadIndex].normal;
position += quads[quadIndex].corners[vertexID];
position *= voxelSize;
position += vec3(chunks[chunkID].position.xyz - playerPositionInteger);
position -= playerPositionFraction;
direction = position;
vec4 mvPos = viewMatrix*vec4(position, 1);
gl_Position = projectionMatrix*mvPos;
mvVertexPos = mvPos.xyz;
distanceForLodCheck = length(mvPos.xyz) + voxelSize;
uv = quads[quadIndex].cornerUV[vertexID]*voxelSize;
opaqueInLod = quads[quadIndex].opaqueInLod;
}