Test shader extension fallback;

This commit is contained in:
bjorn 2018-08-30 03:38:31 -07:00
parent dd889a1c4a
commit 4631d2dacc
2 changed files with 25 additions and 14 deletions

View File

@ -879,9 +879,6 @@ void lovrGpuDraw(DrawCommand* command) {
lovrShaderSetMatrices(shader, "lovrMaterialTransform", material->transform, 0, 9);
// Bind shader resources
lovrShaderBind(shader);
// Bind attributes
lovrMeshBind(mesh, shader);
@ -899,6 +896,12 @@ void lovrGpuDraw(DrawCommand* command) {
instances *= state.singlepass ? command->viewportCount : 1;
for (int i = 0; i < drawCount; i++) {
lovrGpuSetViewports(command->viewports, command->viewportCount, i);
if (!state.singlepass) {
lovrShaderSetInts(shader, "lovrViewportIndex", &i, 0, 1);
}
lovrShaderBind(shader);
uint32_t rangeStart, rangeCount;
lovrMeshGetDrawRange(mesh, &rangeStart, &rangeCount);
uint32_t indexCount;

View File

@ -30,10 +30,10 @@ const char* lovrShaderVertexPrefix = ""
#endif
"#define VERTEX VERTEX \n"
"#define MAX_BONES 48 \n"
"#define lovrView lovrViews[lovrEye] \n"
"#define lovrProjection lovrProjections[lovrEye] \n"
"#define lovrTransform lovrTransforms[lovrEye] \n"
"#define lovrNormalMatrix lovrNormalMatrices[lovrEye] \n"
"#define lovrView lovrViews[lovrViewportIndex] \n"
"#define lovrProjection lovrProjections[lovrViewportIndex] \n"
"#define lovrTransform lovrTransforms[lovrViewportIndex] \n"
"#define lovrNormalMatrix lovrNormalMatrices[lovrViewportIndex] \n"
"in vec3 lovrPosition; \n"
"in vec3 lovrNormal; \n"
"in vec2 lovrTexCoord; \n"
@ -43,7 +43,11 @@ const char* lovrShaderVertexPrefix = ""
"in vec4 lovrBoneWeights; \n"
"out vec2 texCoord; \n"
"out vec4 vertexColor; \n"
"flat out int lovrEye; \n"
"#ifdef GL_AMD_vertex_shader_viewport_index \n"
"#define lovrViewportIndex gl_ViewportIndex \n"
"#else \n"
"uniform int lovrViewportIndex; \n"
"#endif \n"
"uniform mat4 lovrModel; \n"
"uniform mat4 lovrViews[2]; \n"
"uniform mat4 lovrProjections[2]; \n"
@ -65,8 +69,7 @@ const char* lovrShaderVertexSuffix = ""
" lovrPose[lovrBones[3]] * lovrBoneWeights[3]; \n"
" gl_PointSize = lovrPointSize; \n"
"#ifdef GL_AMD_vertex_shader_viewport_index \n"
" gl_ViewportIndex = gl_InstanceID % 2; \n"
" lovrEye = gl_ViewportIndex; \n"
" lovrViewportIndex = gl_InstanceID % 2; \n"
"#endif \n"
" gl_Position = position(lovrProjection, lovrTransform, pose * vec4(lovrPosition, 1.0)); \n"
"}";
@ -78,13 +81,18 @@ const char* lovrShaderFragmentPrefix = ""
#else
"#version 150 \n"
"in vec4 gl_FragCoord; \n"
"#extension GL_AMD_vertex_shader_viewport_index : enable \n"
#endif
"#define PIXEL PIXEL \n"
"#define FRAGMENT FRAGMENT \n"
"in vec2 texCoord; \n"
"in vec4 vertexColor; \n"
"flat in int lovrEye; \n"
"out vec4 lovrCanvas[gl_MaxDrawBuffers]; \n"
"#ifdef GL_AMD_vertex_shader_viewport_index \n"
"#define lovrViewportIndex gl_ViewportIndex \n"
"#else \n"
"uniform int lovrViewportIndex; \n"
"#endif \n"
"uniform float lovrMetalness; \n"
"uniform float lovrRoughness; \n"
"uniform vec4 lovrColor; \n"
@ -130,21 +138,21 @@ const char* lovrDefaultFragmentShader = ""
const char* lovrCubeVertexShader = ""
"out vec3 texturePosition[2]; \n"
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" texturePosition[lovrEye] = -inverse(mat3(transform)) * (inverse(projection) * vertex).xyz; \n"
" texturePosition[lovrViewportIndex] = -inverse(mat3(transform)) * (inverse(projection) * vertex).xyz; \n"
" return vertex; \n"
"}";
const char* lovrCubeFragmentShader = ""
"in vec3 texturePosition[2]; \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" return graphicsColor * texture(lovrEnvironmentTexture, texturePosition[lovrEye]); \n"
" return graphicsColor * texture(lovrEnvironmentTexture, texturePosition[lovrViewportIndex]); \n"
"}";
const char* lovrPanoFragmentShader = ""
"in vec3 texturePosition[2]; \n"
"#define PI 3.141592653589 \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" vec3 direction = texturePosition[lovrEye]; \n"
" vec3 direction = texturePosition[lovrViewportIndex]; \n"
" float theta = acos(direction.y / length(direction)); \n"
" float phi = atan(-direction.x, direction.z); \n"
" uv = vec2(.5 + phi / (2. * PI), theta / PI); \n"