67 lines
2.0 KiB
GLSL
67 lines
2.0 KiB
GLSL
#version 450
|
|
#pragma shader_stage(fragment)
|
|
#extension GL_EXT_nonuniform_qualifier : enable
|
|
|
|
layout (location = 0) in vec2 inUV;
|
|
layout (location = 0) out vec4 outColor;
|
|
|
|
struct VertexData {
|
|
float position[4];
|
|
};
|
|
|
|
struct MaterialData {
|
|
float m_AlbedoFactor[4];
|
|
float m_EmissionFactor[3];
|
|
float m_MetalFactor;
|
|
float m_RoughFactor;
|
|
uint m_AlbedoTex;
|
|
uint m_NormalTex;
|
|
uint m_MetalRoughTex;
|
|
uint m_OcclusionTex;
|
|
uint m_EmissionTex;
|
|
};
|
|
|
|
#define INVALID_HANDLE 0xFFFFFFFF
|
|
|
|
layout(set = 0, binding = 1) uniform sampler2D textures[];
|
|
layout(std430, set = 0, binding = 0) readonly buffer Vertices {
|
|
VertexData data[];
|
|
} vertexBuffer[];
|
|
layout(std430, set = 0, binding = 0) readonly buffer Materials {
|
|
MaterialData data[];
|
|
} materialsBuffer[];
|
|
|
|
|
|
layout(push_constant) uniform Block {
|
|
uint vertexBufferHandle;
|
|
uint uvBufferHandle;
|
|
uint materialBufferHandle;
|
|
uint m_VertexOffset;
|
|
int m_NormalOffset; // <0 for invalid
|
|
int m_TexCoord0Offset; // <0 for invalid
|
|
uint m_FirstIndex;
|
|
uint m_IndexCount;
|
|
int m_MaterialIdx; // <0 for invalid
|
|
} pcb;
|
|
|
|
vec4 ToVec4(float array[4]) {
|
|
return vec4(array[0], array[1], array[2], array[3]);
|
|
}
|
|
|
|
vec4 GetAlbedo(uint materialBufferId, int materialId, vec2 uv0) {
|
|
if (materialId < 0) {
|
|
return vec4(1.0f, 0.0f, 1.0f, 1.0f);
|
|
} else {
|
|
vec4 albedoFactor = ToVec4(materialsBuffer[materialBufferId].data[materialId].m_AlbedoFactor);
|
|
uint albedoTexId = materialsBuffer[materialBufferId].data[materialId].m_AlbedoTex;
|
|
if (albedoTexId == INVALID_HANDLE) {
|
|
return albedoFactor;
|
|
} else {
|
|
return texture(textures[albedoTexId], uv0);
|
|
}
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
outColor = GetAlbedo(pcb.materialBufferHandle, pcb.m_MaterialIdx, inUV);// texture(textures[materialsBuffer[pcb.materialBufferHandle].data[pcb.m_MaterialIdx].m_AlbedoTex], inUV);// ToVec4(materialsBuffer[pcb.materialBufferHandle].data[pcb.m_MaterialIdx].m_AlbedoFactor);// vec4(texture(textures[textureHandle], inUV).rgb, 1.0f);
|
|
} |