1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-11-09 12:22:34 +01:00

Refactor shader init and source

This commit is contained in:
Daniel Evans 2014-06-15 02:12:45 +01:00
parent 014bff2a4e
commit 0a3167d1e9
5 changed files with 176 additions and 129 deletions

View File

@ -0,0 +1,28 @@
#pragma once
#ifndef _GAMESHADERS_HPP_
#define _GAMESHADERS_HPP_
namespace GameShaders {
struct WaterHQ {
static const char* VertexShader;
static const char* FragmentShader;
};
struct WaterLQ {
static const char* VertexShader;
static const char* FragmentShader;
};
struct Sky {
static const char* VertexShader;
static const char* FragmentShader;
};
struct WorldObject {
static const char* VertexShader;
static const char* FragmentShader;
};
}
#endif

View File

@ -10,12 +10,12 @@ public:
ViewFrustum frustum; ViewFrustum frustum;
glm::vec3 worldPos; glm::vec3 worldPos;
ViewCamera() ViewCamera()
: frustum({0.1f, 5000.f, 80.f, 1.f}) : frustum({0.1f, 5000.f, (-75.f / 180.f) * 3.1415f, 1.f})
{ {
} }
}; };
#endif #endif

View File

@ -10,74 +10,12 @@
#include <ai/CharacterController.hpp> #include <ai/CharacterController.hpp>
#include <data/ObjectData.hpp> #include <data/ObjectData.hpp>
#include <render/GameShaders.hpp>
#include <deque> #include <deque>
#include <cmath> #include <cmath>
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
const char *vertexShaderSource = "#version 130\n#extension GL_ARB_explicit_attrib_location : enable\n"
"layout(location = 0) in vec3 position;"
"layout(location = 1) in vec3 normal;"
"layout(location = 2) in vec4 colour;"
"layout(location = 3) in vec2 texCoords;"
"out vec3 Normal;"
"out vec2 TexCoords;"
"out vec4 Colour;"
"out vec4 EyeSpace;"
"uniform mat4 model;"
"uniform mat4 view;"
"uniform mat4 proj;"
"void main()"
"{"
" Normal = normal;"
" TexCoords = texCoords;"
" Colour = colour;"
" vec4 eyeSpace = view * model * vec4(position, 1.0);"
" EyeSpace = proj * eyeSpace;"
" gl_Position = proj * eyeSpace;"
"}";
const char *fragmentShaderSource = "#version 130\n"
"in vec3 Normal;"
"in vec2 TexCoords;"
"in vec4 Colour;"
"in vec4 EyeSpace;"
"uniform sampler2D texture;"
"uniform vec4 BaseColour;"
"uniform vec4 AmbientColour;"
"uniform vec4 DynamicColour;"
"uniform vec3 SunDirection;"
"uniform float FogStart;"
"uniform float FogEnd;"
"uniform float MaterialDiffuse;"
"uniform float MaterialAmbient;"
"void main()"
"{"
" vec4 c = texture2D(texture, TexCoords);"
" if(c.a < 0.1) discard;"
" float fogZ = (gl_FragCoord.z / gl_FragCoord.w);"
" float fogfac = clamp( (FogEnd-fogZ)/(FogEnd-FogStart), 0.0, 1.0 );"
//" gl_FragColor = mix(AmbientColour, c, fogfac);"
" gl_FragColor = mix(AmbientColour, BaseColour * (vec4(0.5) + Colour * 0.5) * (vec4(0.5) + DynamicColour * 0.5) * c, fogfac);"
"}";
const char *skydomeVertexShaderSource = "#version 130\n"
"in vec3 position;"
"uniform mat4 view;"
"uniform mat4 proj;"
"out vec3 Position;"
"uniform float Far;"
"void main() {"
" Position = position;"
" vec4 viewsp = proj * mat4(mat3(view)) * vec4(position, 1.0);"
" viewsp.z = viewsp.w - 0.000001;"
" gl_Position = viewsp;"
"}";
const char *skydomeFragmentShaderSource = "#version 130\n"
"in vec3 Position;"
"uniform vec4 TopColor;"
"uniform vec4 BottomColor;"
"void main() {"
" gl_FragColor = mix(BottomColor, TopColor, clamp(Position.z, 0, 1));"
"}";
const size_t skydomeSegments = 8, skydomeRows = 10; const size_t skydomeSegments = 8, skydomeRows = 10;
struct WaterVertex { struct WaterVertex {
@ -104,36 +42,6 @@ DrawBuffer waterLQDraw;
GeometryBuffer waterHQBuffer; GeometryBuffer waterHQBuffer;
DrawBuffer waterHQDraw; DrawBuffer waterHQDraw;
const char *waterVSSource = R"(
#version 130
#extension GL_ARB_explicit_attrib_location : enable
layout(location = 0) in vec2 position;
out vec2 TexCoords;
uniform float height;
uniform float size;
uniform mat4 MVP;
uniform float time;
uniform vec2 worldP;
uniform vec2 waveParams;
void main()
{
vec2 p = worldP + position * size;
float waveHeight = (1.0+sin(time + (p.x + p.y) * waveParams.x)) * waveParams.y;
TexCoords = position * 2.0;
gl_Position = MVP * vec4(p, height + waveHeight, 1.0);
})";
const char *waterFSSource = R"(
#version 130
in vec3 Normal;
in vec2 TexCoords;
uniform sampler2D texture;
void main() {
vec4 c = texture2D(texture, TexCoords);
gl_FragColor = c;
})";
GLuint compileShader(GLenum type, const char *source) GLuint compileShader(GLenum type, const char *source)
{ {
GLuint shader = glCreateShader(type); GLuint shader = glCreateShader(type);
@ -156,16 +64,26 @@ GLuint compileShader(GLenum type, const char *source)
return shader; return shader;
} }
GLuint compileProgram(const char* vertex, const char* fragment)
{
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertex);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragment);
GLuint prog = glCreateProgram();
glAttachShader(prog, vertexShader);
glAttachShader(prog, fragmentShader);
glLinkProgram(prog);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return prog;
}
GameRenderer::GameRenderer(GameWorld* engine) GameRenderer::GameRenderer(GameWorld* engine)
: engine(engine), _renderAlpha(0.f) : engine(engine), _renderAlpha(0.f)
{ {
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderSource); worldProgram = compileProgram(GameShaders::WorldObject::VertexShader,
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderSource); GameShaders::WorldObject::FragmentShader);
worldProgram = glCreateProgram();
glAttachShader(worldProgram, vertexShader);
glAttachShader(worldProgram, fragmentShader);
glLinkProgram(worldProgram);
glUseProgram(worldProgram);
uniModel = glGetUniformLocation(worldProgram, "model"); uniModel = glGetUniformLocation(worldProgram, "model");
uniView = glGetUniformLocation(worldProgram, "view"); uniView = glGetUniformLocation(worldProgram, "view");
@ -178,18 +96,26 @@ GameRenderer::GameRenderer(GameWorld* engine)
uniMatAmbient = glGetUniformLocation(worldProgram, "MaterialAmbient"); uniMatAmbient = glGetUniformLocation(worldProgram, "MaterialAmbient");
uniFogStart = glGetUniformLocation(worldProgram, "FogStart"); uniFogStart = glGetUniformLocation(worldProgram, "FogStart");
uniFogEnd = glGetUniformLocation(worldProgram, "FogEnd"); uniFogEnd = glGetUniformLocation(worldProgram, "FogEnd");
vertexShader = compileShader(GL_VERTEX_SHADER, skydomeVertexShaderSource); skyProgram = compileProgram(GameShaders::Sky::VertexShader,
fragmentShader = compileShader(GL_FRAGMENT_SHADER, skydomeFragmentShaderSource); GameShaders::Sky::FragmentShader);
skyProgram = glCreateProgram();
glAttachShader(skyProgram, vertexShader);
glAttachShader(skyProgram, fragmentShader);
glLinkProgram(skyProgram);
glUseProgram(skyProgram);
skyUniView = glGetUniformLocation(skyProgram, "view"); skyUniView = glGetUniformLocation(skyProgram, "view");
skyUniProj = glGetUniformLocation(skyProgram, "proj"); skyUniProj = glGetUniformLocation(skyProgram, "proj");
skyUniTop = glGetUniformLocation(skyProgram, "TopColor"); skyUniTop = glGetUniformLocation(skyProgram, "TopColor");
skyUniBottom = glGetUniformLocation(skyProgram, "BottomColor"); skyUniBottom = glGetUniformLocation(skyProgram, "BottomColor");
waterProgram = compileProgram(GameShaders::WaterHQ::VertexShader,
GameShaders::WaterHQ::FragmentShader);
waterHeight = glGetUniformLocation(waterProgram, "height");
waterTexture = glGetUniformLocation(waterProgram, "texture");
waterSize = glGetUniformLocation(waterProgram, "size");
waterMVP = glGetUniformLocation(waterProgram, "MVP");
waterTime = glGetUniformLocation(waterProgram, "time");
waterPosition = glGetUniformLocation(waterProgram, "worldP");
waterWave = glGetUniformLocation(waterProgram, "waveParams");
glGenVertexArrays( 1, &vao ); glGenVertexArrays( 1, &vao );
@ -219,20 +145,7 @@ GameRenderer::GameRenderer(GameWorld* engine)
waterHQDraw.addGeometry(&waterHQBuffer); waterHQDraw.addGeometry(&waterHQBuffer);
waterHQDraw.setFaceType(GL_TRIANGLES); waterHQDraw.setFaceType(GL_TRIANGLES);
GLuint waterVS = compileShader(GL_VERTEX_SHADER, waterVSSource);
GLuint waterFS = compileShader(GL_FRAGMENT_SHADER, waterFSSource);
waterProgram = glCreateProgram();
glAttachShader(waterProgram, waterVS);
glAttachShader(waterProgram, waterFS);
glLinkProgram(waterProgram);
waterHeight = glGetUniformLocation(waterProgram, "height");
waterTexture = glGetUniformLocation(waterProgram, "texture");
waterSize = glGetUniformLocation(waterProgram, "size");
waterMVP = glGetUniformLocation(waterProgram, "MVP");
waterTime = glGetUniformLocation(waterProgram, "time");
waterPosition = glGetUniformLocation(waterProgram, "worldP");
waterWave = glGetUniformLocation(waterProgram, "waveParams");
// And our skydome while we're at it. // And our skydome while we're at it.
glGenBuffers(1, &skydomeVBO); glGenBuffers(1, &skydomeVBO);
glBindBuffer(GL_ARRAY_BUFFER, skydomeVBO); glBindBuffer(GL_ARRAY_BUFFER, skydomeVBO);

View File

@ -0,0 +1,106 @@
#include <render/GameShaders.hpp>
namespace GameShaders {
const char* WaterHQ::VertexShader = R"(
#version 130
#extension GL_ARB_explicit_attrib_location : enable
layout(location = 0) in vec2 position;
out vec2 TexCoords;
uniform float height;
uniform float size;
uniform mat4 MVP;
uniform float time;
uniform vec2 worldP;
uniform vec2 waveParams;
void main()
{
vec2 p = worldP + position * size;
float waveHeight = (1.0+sin(time + (p.x + p.y) * waveParams.x)) * waveParams.y;
TexCoords = position * 2.0;
gl_Position = MVP * vec4(p, height + waveHeight, 1.0);
})";
const char* WaterHQ::FragmentShader = R"(
#version 130
in vec3 Normal;
in vec2 TexCoords;
uniform sampler2D texture;
void main() {
vec4 c = texture2D(texture, TexCoords);
gl_FragColor = c;
})";
const char* Sky::VertexShader = R"(
#version 130
in vec3 position;
uniform mat4 view;
uniform mat4 proj;
out vec3 Position;
uniform float Far;
void main() {
Position = position;
vec4 viewsp = proj * mat4(mat3(view)) * vec4(position, 1.0);
viewsp.z = viewsp.w - 0.000001;
gl_Position = viewsp;
})";
const char* Sky::FragmentShader = R"(
#version 130
in vec3 Position;
uniform vec4 TopColor;
uniform vec4 BottomColor;
void main() {
gl_FragColor = mix(BottomColor, TopColor, clamp(Position.z, 0, 1));
})";
const char* WorldObject::VertexShader = R"(
#version 130
#extension GL_ARB_explicit_attrib_location : enable
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec4 colour;
layout(location = 3) in vec2 texCoords;
out vec3 Normal;
out vec2 TexCoords;
out vec4 Colour;
out vec4 EyeSpace;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
void main()
{
Normal = normal;
TexCoords = texCoords;
Colour = colour;
vec4 eyeSpace = view * model * vec4(position, 1.0);
EyeSpace = proj * eyeSpace;
gl_Position = proj * eyeSpace;
})";
const char* WorldObject::FragmentShader = R"(
#version 130
in vec3 Normal;
in vec2 TexCoords;
in vec4 Colour;
in vec4 EyeSpace;
uniform sampler2D texture;
uniform vec4 BaseColour;
uniform vec4 AmbientColour;
uniform vec4 DynamicColour;
uniform vec3 SunDirection;
uniform float FogStart;
uniform float FogEnd;
uniform float MaterialDiffuse;
uniform float MaterialAmbient;
void main()
{
vec4 c = texture2D(texture, TexCoords);
if(c.a < 0.1) discard;
float fogZ = (gl_FragCoord.z / gl_FragCoord.w);
float fogfac = clamp( (FogEnd-fogZ)/(FogEnd-FogStart), 0.0, 1.0 );
// gl_FragColor = mix(AmbientColour, c, fogfac);
gl_FragColor = mix(AmbientColour, BaseColour * (vec4(0.5) + Colour * 0.5) * (vec4(0.5) + DynamicColour * 0.5) * c, fogfac);
})";
}

View File

@ -40,8 +40,8 @@ int debugMode = 0;
sf::Font font; sf::Font font;
glm::vec3 viewPosition { -200.f, -100.f, 45.f }; glm::vec3 viewPosition { -260.f, -151.5f, 9.f };
glm::vec2 viewAngles { -0.90f, 0.2f }; glm::vec2 viewAngles { -0.3f, 0.05f };
void setViewParameters(const glm::vec3 &center, const glm::vec2 &angles) void setViewParameters(const glm::vec3 &center, const glm::vec2 &angles)
{ {