diff --git a/src/graphics/opengl.c b/src/graphics/opengl.c index 10f133cd..e92abc3e 100644 --- a/src/graphics/opengl.c +++ b/src/graphics/opengl.c @@ -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; diff --git a/src/resources/shaders.c b/src/resources/shaders.c index bc5fd218..f84c1df4 100644 --- a/src/resources/shaders.c +++ b/src/resources/shaders.c @@ -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"