replacing the glTransform pipeline for model rendering

This commit is contained in:
Sam Gateau 2015-02-16 22:08:21 -08:00
parent cc3cc4f96f
commit 23354da828
7 changed files with 48 additions and 39 deletions

View file

@ -156,7 +156,7 @@ void Batch::setViewTransform(const Transform& view) {
void Batch::setProjectionTransform(const Mat4& proj) {
ADD_COMMAND(setProjectionTransform);
_params.push_back(cacheData(sizeof(Mat4), &proj);
_params.push_back(cacheData(sizeof(Mat4), &proj));
}
void Batch::setUniformBuffer(uint32 slot, const BufferPointer& buffer, Offset offset, Offset size) {

View file

@ -80,21 +80,25 @@ GLBackend::~GLBackend() {
}
void GLBackend::renderBatch(Batch& batch) {
void GLBackend::render(Batch& batch) {
uint32 numCommands = batch.getCommands().size();
const Batch::Commands::value_type* command = batch.getCommands().data();
const Batch::CommandOffsets::value_type* offset = batch.getCommandOffsets().data();
GLBackend backend;
for (unsigned int i = 0; i < numCommands; i++) {
CommandCall call = _commandCalls[(*command)];
(backend.*(call))(batch, *offset);
(this->*(call))(batch, *offset);
command++;
offset++;
}
}
void GLBackend::renderBatch(Batch& batch) {
GLBackend backend;
backend.render(batch);
}
void GLBackend::checkGLError() {
GLenum error = glGetError();
if (!error) {
@ -416,9 +420,9 @@ void GLBackend::killTransform() {
#else
#endif
}
#define LEGACY_TRANSFORM_PIPELINE 1
void GLBackend::updateTransform() {
#define LEGACY_TRANSFORM_PIPELINE
#ifdef LEGACY_TRANSFORM_PIPELINE
if (_transform._invalidProj) {
// TODO: implement the projection matrix assignment to gl state

View file

@ -27,10 +27,13 @@ public:
GLBackend();
~GLBackend();
void render(Batch& batch);
static void renderBatch(Batch& batch);
static void checkGLError();
class GLBuffer {
public:
@ -138,7 +141,7 @@ protected:
_projection(),
_invalidModel(true),
_invalidView(true),
_invalidProj(true),
_invalidProj(false),
_lastMode(GL_TEXTURE) {}
} _transform;

View file

@ -870,7 +870,11 @@ void ViewFrustum::evalProjectionMatrix(glm::mat4& proj) const {
if (isOrthographic()) {
proj = glm::ortho(getWidth() * -0.5, getWidth() * +0.5, getHeight() * -0.5, getHeight() * 0.5);
} else {
proj = glm::perspective(getFieldOfView(), getAspectRatio(), getNearClip(), getFarClip());
float left, right, bottom, top, near, far;
glm::vec4 clip0, clip1;
computeOffAxisFrustum(left, right, bottom, top, near, far, clip0, clip1);
proj = glm::perspective(glm::radians(getFieldOfView()), getAspectRatio(), getNearClip(), getFarClip());
// proj = glm::perspective(getFieldOfView() * 0.5f, getAspectRatio(), getNearClip(), getFarClip());
}
}

View file

@ -95,7 +95,10 @@ vec3 evalAmbienSphereGlobalColor(float shadowAttenuation, vec3 position, vec3 no
vec3 evalLightmappedColor(float shadowAttenuation, vec3 normal, vec3 diffuse, vec3 lightmap) {
Light light = getLight();
float diffuseDot = dot(normal, getLightDirection(light));
vec3 fragNormal = vec3(invViewMat * vec4(normal, 0.0));
float diffuseDot = dot(fragNormal, getLightDirection(light));
// need to catch normals perpendicular to the projection plane hence the magic number for the threshold
// it should be just 0, but we have innacurracy so we need to overshoot

View file

@ -687,6 +687,12 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) {
_renderBatch.clear();
gpu::Batch& batch = _renderBatch;
if (args) {
glm::mat4 proj;
args->_viewFrustum->evalProjectionMatrix(proj);
batch.setProjectionTransform(proj);
}
// Capture the view matrix once for the rendering of this model
if (_transforms.empty()) {
_transforms.push_back(Transform());
@ -1659,26 +1665,26 @@ void Model::setupBatchTransform(gpu::Batch& batch) {
void Model::endScene(RenderMode mode, RenderArgs* args) {
PROFILE_RANGE(__FUNCTION__);
#if defined(ANDROID)
#else
glPushMatrix();
#endif
RenderArgs::RenderSide renderSide = RenderArgs::MONO;
if (args) {
renderSide = args->_renderSide;
}
gpu::GLBackend backend;
if (args) {
glm::mat4 proj;
args->_viewFrustum->evalProjectionMatrix(proj);
gpu::Batch batch;
batch.setProjectionTransform(proj);
::gpu::GLBackend::renderBatch(batch);
backend.render(batch);
}
_viewState->getViewTransform();
// apply entity translation offset to the viewTransform in one go (it's a preTranslate because viewTransform goes from world to eye space)
_transforms[0].preTranslate(-_translation);
// Do the rendering batch creation for mono or left eye, not for right eye
if (renderSide != RenderArgs::STEREO_RIGHT) {
// Let's introduce a gpu::Batch to capture all the calls to the graphics api
@ -1833,19 +1839,15 @@ void Model::endScene(RenderMode mode, RenderArgs* args) {
// Render!
{
PROFILE_RANGE("render Batch");
#if defined(ANDROID)
#else
glPushMatrix();
#endif
::gpu::GLBackend::renderBatch(_sceneRenderBatch);
#if defined(ANDROID)
#else
glPopMatrix();
#endif
backend.render(_sceneRenderBatch);
}
#if defined(ANDROID)
#else
glPopMatrix();
#endif
// restore all the default material settings
_viewState->setupWorldLight();

View file

@ -11,19 +11,14 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@include gpu/Transform.slh@>
//include gpu/Transform.slh
const int MAX_TEXCOORDS = 2;
<$inputPosition(vin_position)$>
<$inputNormal(vin_normal)$>
<$inputTexcoord(vin_texcoord)$>
<$inputColor(vin_color)$>
uniform mat4 texcoordMatrices[MAX_TEXCOORDS];
// the interpolated normal
varying vec4 normal;
/*
void main(void) {
// transform and store the normal for interpolation
normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0));
@ -37,10 +32,9 @@ void main(void) {
// use standard pipeline transform
gl_Position = gl_ModelViewProjectionMatrix * vec4(vin_position, 1.0);
}
*/
/*
void main(void) {
// transform and store the normal for interpolation
normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0));
@ -54,4 +48,3 @@ void main(void) {
// use standard pipeline transform
gl_Position = ftransform();
}
*/