vegetation: Removed index variable in impostor shader
It was used for texture coordinates, but is now precomputed in the vertex array
This commit is contained in:
parent
da5219c01f
commit
d2b4a1ea5e
5 changed files with 7 additions and 11 deletions
|
@ -6,7 +6,7 @@
|
||||||
#include "OpenGLPart.h"
|
#include "OpenGLPart.h"
|
||||||
#include "DefinitionWatcher.h"
|
#include "DefinitionWatcher.h"
|
||||||
|
|
||||||
#include <map>
|
#include <vector>
|
||||||
|
|
||||||
namespace paysages {
|
namespace paysages {
|
||||||
namespace opengl {
|
namespace opengl {
|
||||||
|
|
|
@ -53,14 +53,13 @@ OpenGLVegetationImpostor::~OpenGLVegetationImpostor() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLVegetationImpostor::render(OpenGLShaderProgram *program, const OpenGLVegetationInstance *instance,
|
void OpenGLVegetationImpostor::render(OpenGLShaderProgram *program, const OpenGLVegetationInstance *instance,
|
||||||
int instance_index, const Vector3 &camera_location) {
|
const Vector3 &camera_location) {
|
||||||
if (instance_index == 0 or texture_changed) {
|
if (texture_changed) {
|
||||||
texture_changed = false;
|
texture_changed = false;
|
||||||
state->set("impostorTexture", texture);
|
state->set("impostorTexture", texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
int index = getIndex(camera_location, instance->getBase());
|
int index = getIndex(camera_location, instance->getBase());
|
||||||
state->setInt("index", index);
|
|
||||||
state->set("offset", instance->getBase());
|
state->set("offset", instance->getBase());
|
||||||
state->set("size", 2.0 * instance->getSize());
|
state->set("size", 2.0 * instance->getSize());
|
||||||
program->draw(vertices, state, index * 4, 4);
|
program->draw(vertices, state, index * 4, 4);
|
||||||
|
@ -142,7 +141,7 @@ void OpenGLVegetationImpostor::setVertex(int i, float u, float v) {
|
||||||
Matrix4 rotation = matrixForIndex(index);
|
Matrix4 rotation = matrixForIndex(index);
|
||||||
|
|
||||||
Vector3 vertex = rotation.multPoint(Vector3(1.0, u, -(v - 0.5)));
|
Vector3 vertex = rotation.multPoint(Vector3(1.0, u, -(v - 0.5)));
|
||||||
vertices->set(index * 4 + i, vertex, u, v);
|
vertices->set(index * 4 + i, vertex, (u + (double)px) / (double)parts, (v + (double)py) / (double)parts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,7 @@ class OPENGLSHARED_EXPORT OpenGLVegetationImpostor {
|
||||||
/**
|
/**
|
||||||
* Render a single instance using this impostor.
|
* Render a single instance using this impostor.
|
||||||
*/
|
*/
|
||||||
void render(OpenGLShaderProgram *program, const OpenGLVegetationInstance *instance, int instance_index,
|
void render(OpenGLShaderProgram *program, const OpenGLVegetationInstance *instance, const Vector3 &camera_location);
|
||||||
const Vector3 &camera_location);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare the texture grid for a given model.
|
* Prepare the texture grid for a given model.
|
||||||
|
|
|
@ -115,9 +115,8 @@ void OpenGLVegetationLayer::render() {
|
||||||
lock_instances->acquire();
|
lock_instances->acquire();
|
||||||
|
|
||||||
// TODO Instanced rendering
|
// TODO Instanced rendering
|
||||||
int index = 0;
|
|
||||||
for (auto instance : instances) {
|
for (auto instance : instances) {
|
||||||
impostor->render(parent->getProgram(), instance, index++, *camera_location);
|
impostor->render(parent->getProgram(), instance, *camera_location);
|
||||||
}
|
}
|
||||||
|
|
||||||
lock_instances->release();
|
lock_instances->release();
|
||||||
|
|
|
@ -3,7 +3,6 @@ in highp vec2 uv;
|
||||||
uniform highp mat4 viewMatrix;
|
uniform highp mat4 viewMatrix;
|
||||||
uniform highp vec3 offset;
|
uniform highp vec3 offset;
|
||||||
uniform float size;
|
uniform float size;
|
||||||
uniform int index;
|
|
||||||
out vec3 unprojected;
|
out vec3 unprojected;
|
||||||
out vec2 texcoord;
|
out vec2 texcoord;
|
||||||
uniform float waterOffset;
|
uniform float waterOffset;
|
||||||
|
@ -11,6 +10,6 @@ uniform float waterOffset;
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
unprojected = offset + size * vertex; // + vec3(0, waterOffset, 0)
|
unprojected = offset + size * vertex; // + vec3(0, waterOffset, 0)
|
||||||
texcoord = vec2(0.25 * (uv.s + float(mod(index, 4))), 0.25 * (uv.t + float(index / 4)));
|
texcoord = uv;
|
||||||
gl_Position = viewMatrix * vec4(unprojected, 1.0);
|
gl_Position = viewMatrix * vec4(unprojected, 1.0);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue