|
@@ -24,6 +24,42 @@ using TevStageConfig = TexturingRegs::TevStageConfig;
|
|
|
|
|
|
|
|
namespace GLShader {
|
|
namespace GLShader {
|
|
|
|
|
|
|
|
|
|
+static const std::string UniformBlockDef = R"(
|
|
|
|
|
+#define NUM_TEV_STAGES 6
|
|
|
|
|
+#define NUM_LIGHTS 8
|
|
|
|
|
+
|
|
|
|
|
+struct LightSrc {
|
|
|
|
|
+ vec3 specular_0;
|
|
|
|
|
+ vec3 specular_1;
|
|
|
|
|
+ vec3 diffuse;
|
|
|
|
|
+ vec3 ambient;
|
|
|
|
|
+ vec3 position;
|
|
|
|
|
+ vec3 spot_direction;
|
|
|
|
|
+ float dist_atten_bias;
|
|
|
|
|
+ float dist_atten_scale;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+layout (std140) uniform shader_data {
|
|
|
|
|
+ vec2 framebuffer_scale;
|
|
|
|
|
+ int alphatest_ref;
|
|
|
|
|
+ float depth_scale;
|
|
|
|
|
+ float depth_offset;
|
|
|
|
|
+ int scissor_x1;
|
|
|
|
|
+ int scissor_y1;
|
|
|
|
|
+ int scissor_x2;
|
|
|
|
|
+ int scissor_y2;
|
|
|
|
|
+ vec3 fog_color;
|
|
|
|
|
+ vec2 proctex_noise_f;
|
|
|
|
|
+ vec2 proctex_noise_a;
|
|
|
|
|
+ vec2 proctex_noise_p;
|
|
|
|
|
+ vec3 lighting_global_ambient;
|
|
|
|
|
+ LightSrc light_src[NUM_LIGHTS];
|
|
|
|
|
+ vec4 const_color[NUM_TEV_STAGES];
|
|
|
|
|
+ vec4 tev_combiner_buffer_color;
|
|
|
|
|
+ vec4 clip_coef;
|
|
|
|
|
+};
|
|
|
|
|
+)";
|
|
|
|
|
+
|
|
|
PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
|
|
PicaShaderConfig PicaShaderConfig::BuildFromRegs(const Pica::Regs& regs) {
|
|
|
PicaShaderConfig res;
|
|
PicaShaderConfig res;
|
|
|
|
|
|
|
@@ -1008,8 +1044,6 @@ std::string GenerateFragmentShader(const PicaShaderConfig& config) {
|
|
|
|
|
|
|
|
std::string out = R"(
|
|
std::string out = R"(
|
|
|
#version 330 core
|
|
#version 330 core
|
|
|
-#define NUM_TEV_STAGES 6
|
|
|
|
|
-#define NUM_LIGHTS 8
|
|
|
|
|
|
|
|
|
|
in vec4 primary_color;
|
|
in vec4 primary_color;
|
|
|
in vec2 texcoord[3];
|
|
in vec2 texcoord[3];
|
|
@@ -1021,36 +1055,6 @@ in vec4 gl_FragCoord;
|
|
|
|
|
|
|
|
out vec4 color;
|
|
out vec4 color;
|
|
|
|
|
|
|
|
-struct LightSrc {
|
|
|
|
|
- vec3 specular_0;
|
|
|
|
|
- vec3 specular_1;
|
|
|
|
|
- vec3 diffuse;
|
|
|
|
|
- vec3 ambient;
|
|
|
|
|
- vec3 position;
|
|
|
|
|
- vec3 spot_direction;
|
|
|
|
|
- float dist_atten_bias;
|
|
|
|
|
- float dist_atten_scale;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-layout (std140) uniform shader_data {
|
|
|
|
|
- vec2 framebuffer_scale;
|
|
|
|
|
- int alphatest_ref;
|
|
|
|
|
- float depth_scale;
|
|
|
|
|
- float depth_offset;
|
|
|
|
|
- int scissor_x1;
|
|
|
|
|
- int scissor_y1;
|
|
|
|
|
- int scissor_x2;
|
|
|
|
|
- int scissor_y2;
|
|
|
|
|
- vec3 fog_color;
|
|
|
|
|
- vec2 proctex_noise_f;
|
|
|
|
|
- vec2 proctex_noise_a;
|
|
|
|
|
- vec2 proctex_noise_p;
|
|
|
|
|
- vec3 lighting_global_ambient;
|
|
|
|
|
- LightSrc light_src[NUM_LIGHTS];
|
|
|
|
|
- vec4 const_color[NUM_TEV_STAGES];
|
|
|
|
|
- vec4 tev_combiner_buffer_color;
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
uniform sampler2D tex[3];
|
|
uniform sampler2D tex[3];
|
|
|
uniform samplerBuffer lighting_lut;
|
|
uniform samplerBuffer lighting_lut;
|
|
|
uniform samplerBuffer fog_lut;
|
|
uniform samplerBuffer fog_lut;
|
|
@@ -1059,7 +1063,11 @@ uniform samplerBuffer proctex_color_map;
|
|
|
uniform samplerBuffer proctex_alpha_map;
|
|
uniform samplerBuffer proctex_alpha_map;
|
|
|
uniform samplerBuffer proctex_lut;
|
|
uniform samplerBuffer proctex_lut;
|
|
|
uniform samplerBuffer proctex_diff_lut;
|
|
uniform samplerBuffer proctex_diff_lut;
|
|
|
|
|
+)";
|
|
|
|
|
+
|
|
|
|
|
+ out += UniformBlockDef;
|
|
|
|
|
|
|
|
|
|
+ out += R"(
|
|
|
// Rotate the vector v by the quaternion q
|
|
// Rotate the vector v by the quaternion q
|
|
|
vec3 quaternion_rotate(vec4 q, vec3 v) {
|
|
vec3 quaternion_rotate(vec4 q, vec3 v) {
|
|
|
return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
|
|
return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
|
|
@@ -1190,6 +1198,12 @@ out float texcoord0_w;
|
|
|
out vec4 normquat;
|
|
out vec4 normquat;
|
|
|
out vec3 view;
|
|
out vec3 view;
|
|
|
|
|
|
|
|
|
|
+)";
|
|
|
|
|
+
|
|
|
|
|
+ out += UniformBlockDef;
|
|
|
|
|
+
|
|
|
|
|
+ out += R"(
|
|
|
|
|
+
|
|
|
void main() {
|
|
void main() {
|
|
|
primary_color = vert_color;
|
|
primary_color = vert_color;
|
|
|
texcoord[0] = vert_texcoord0;
|
|
texcoord[0] = vert_texcoord0;
|
|
@@ -1200,7 +1214,7 @@ void main() {
|
|
|
view = vert_view;
|
|
view = vert_view;
|
|
|
gl_Position = vert_position;
|
|
gl_Position = vert_position;
|
|
|
gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
|
|
gl_ClipDistance[0] = -vert_position.z; // fixed PICA clipping plane z <= 0
|
|
|
- // TODO (wwylele): calculate gl_ClipDistance[1] from user-defined clipping plane
|
|
|
|
|
|
|
+ gl_ClipDistance[1] = dot(clip_coef, vert_position);
|
|
|
}
|
|
}
|
|
|
)";
|
|
)";
|
|
|
|
|
|