mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 08:04:01 +02:00
Porting and potentially fixing the stereo drawcall, still not perfrect ork in progress
This commit is contained in:
parent
5bdfceebc5
commit
9d2043cc3c
5 changed files with 51 additions and 20 deletions
|
@ -351,13 +351,6 @@ void GLBackend::setupStereoSide(int side) {
|
|||
|
||||
}
|
||||
#else
|
||||
void GLBackend::setupStereoSide(int side) {
|
||||
ivec4 vp = _transform._viewport;
|
||||
vp.z /= 2;
|
||||
glViewport(vp.x + side * vp.z, vp.y, vp.z, vp.w);
|
||||
|
||||
_transform.bindCurrentCamera(side);
|
||||
}
|
||||
#endif
|
||||
|
||||
void GLBackend::do_resetStages(const Batch& batch, size_t paramOffset) {
|
||||
|
@ -412,7 +405,7 @@ void GLBackend::do_popProfileRange(const Batch& batch, size_t paramOffset) {
|
|||
|
||||
// As long as we don;t use several versions of shaders we can avoid this more complex code path
|
||||
#ifdef GPU_STEREO_CAMERA_BUFFER
|
||||
#define GET_UNIFORM_LOCATION(shaderUniformLoc) _pipeline._programShader->getUniformLocation(shaderUniformLoc, isStereo())
|
||||
#define GET_UNIFORM_LOCATION(shaderUniformLoc) _pipeline._programShader->getUniformLocation(shaderUniformLoc, (GLShader::Version) isStereo())
|
||||
#else
|
||||
#define GET_UNIFORM_LOCATION(shaderUniformLoc) shaderUniformLoc
|
||||
#endif
|
||||
|
|
|
@ -31,9 +31,9 @@
|
|||
|
||||
|
||||
// Pick one from the 3: THis version is the most efficient as of now
|
||||
#define GPU_STEREO_TECHNIQUE_DOUBLED_SIMPLE
|
||||
//#define GPU_STEREO_TECHNIQUE_DOUBLED_SIMPLE
|
||||
//#define GPU_STEREO_TECHNIQUE_DOUBLED_SMARTER
|
||||
//#define GPU_STEREO_TECHNIQUE_INSTANCED
|
||||
#define GPU_STEREO_TECHNIQUE_INSTANCED
|
||||
|
||||
|
||||
// Let these be configured by the one define picked above
|
||||
|
|
|
@ -51,7 +51,7 @@ void GLBackend::do_setPipeline(const Batch& batch, size_t paramOffset) {
|
|||
// check the program cache
|
||||
// pick the program version
|
||||
#ifdef GPU_STEREO_CAMERA_BUFFER
|
||||
GLuint glprogram = pipelineObject->_program->getProgram(isStereo());
|
||||
GLuint glprogram = pipelineObject->_program->getProgram((GLShader::Version) isStereo());
|
||||
#else
|
||||
GLuint glprogram = pipelineObject->_program->getProgram();
|
||||
#endif
|
||||
|
|
|
@ -25,11 +25,14 @@ void GL41Backend::do_draw(const Batch& batch, size_t paramOffset) {
|
|||
uint32 startVertex = batch._params[paramOffset + 0]._uint;
|
||||
|
||||
if (isStereo()) {
|
||||
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||
glDrawArraysInstanced(mode, startVertex, numVertices, 2);
|
||||
#else
|
||||
setupStereoSide(0);
|
||||
glDrawArrays(mode, startVertex, numVertices);
|
||||
setupStereoSide(1);
|
||||
glDrawArrays(mode, startVertex, numVertices);
|
||||
|
||||
#endif
|
||||
_stats._DSNumTriangles += 2 * numVertices / 3;
|
||||
_stats._DSNumDrawcalls += 2;
|
||||
|
||||
|
@ -55,11 +58,14 @@ void GL41Backend::do_drawIndexed(const Batch& batch, size_t paramOffset) {
|
|||
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
|
||||
|
||||
if (isStereo()) {
|
||||
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||
glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, 2);
|
||||
#else
|
||||
setupStereoSide(0);
|
||||
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
||||
setupStereoSide(1);
|
||||
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
||||
|
||||
#endif
|
||||
_stats._DSNumTriangles += 2 * numIndices / 3;
|
||||
_stats._DSNumDrawcalls += 2;
|
||||
} else {
|
||||
|
@ -83,11 +89,14 @@ void GL41Backend::do_drawInstanced(const Batch& batch, size_t paramOffset) {
|
|||
if (isStereo()) {
|
||||
GLint trueNumInstances = 2 * numInstances;
|
||||
|
||||
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||
glDrawArraysInstanced(mode, startVertex, numVertices, trueNumInstances);
|
||||
#else
|
||||
setupStereoSide(0);
|
||||
glDrawArraysInstancedARB(mode, startVertex, numVertices, numInstances);
|
||||
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
|
||||
setupStereoSide(1);
|
||||
glDrawArraysInstancedARB(mode, startVertex, numVertices, numInstances);
|
||||
|
||||
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
|
||||
#endif
|
||||
_stats._DSNumTriangles += (trueNumInstances * numVertices) / 3;
|
||||
_stats._DSNumDrawcalls += trueNumInstances;
|
||||
} else {
|
||||
|
@ -124,10 +133,14 @@ void GL41Backend::do_drawIndexedInstanced(const Batch& batch, size_t paramOffset
|
|||
if (isStereo()) {
|
||||
GLint trueNumInstances = 2 * numInstances;
|
||||
|
||||
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, trueNumInstances, 0, startInstance);
|
||||
#else
|
||||
setupStereoSide(0);
|
||||
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
||||
setupStereoSide(1);
|
||||
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
||||
#endif
|
||||
|
||||
_stats._DSNumTriangles += (trueNumInstances * numIndices) / 3;
|
||||
_stats._DSNumDrawcalls += trueNumInstances;
|
||||
|
|
|
@ -18,6 +18,7 @@ struct TransformCamera {
|
|||
mat4 _projection;
|
||||
mat4 _projectionInverse;
|
||||
vec4 _viewport;
|
||||
vec4 _stereoInfo;
|
||||
};
|
||||
|
||||
layout(std140) uniform transformCameraBuffer {
|
||||
|
@ -32,7 +33,7 @@ layout(std140) uniform transformCameraBuffer {
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifdef VERTEX_SHADER
|
||||
#ifdef GPU_VERTEX_SHADER
|
||||
#ifdef GPU_TRANSFORM_IS_STEREO
|
||||
|
||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||
|
@ -47,7 +48,7 @@ flat out int _stereoSide;
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef PIXEL_SHADER
|
||||
#ifdef GPU_PIXEL_SHADER
|
||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||
flat in int _stereoSide;
|
||||
#endif
|
||||
|
@ -56,7 +57,7 @@ flat in int _stereoSide;
|
|||
TransformCamera getTransformCamera() {
|
||||
#ifdef GPU_TRANSFORM_IS_STEREO
|
||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||
#ifdef VERTEX_SHADER
|
||||
#ifdef GPU_VERTEX_SHADER
|
||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA_ATTRIBUTED
|
||||
_stereoSide = _inStereoSide;
|
||||
#endif
|
||||
|
@ -72,8 +73,32 @@ TransformCamera getTransformCamera() {
|
|||
return _camera;
|
||||
#endif
|
||||
}
|
||||
<@endfunc@>
|
||||
|
||||
vec3 getEyeWorldPos() {
|
||||
return getTransformCamera()._viewInverse[3].xyz;
|
||||
}
|
||||
|
||||
bool cam_isStereo() {
|
||||
#ifdef GPU_TRANSFORM_IS_STEREO
|
||||
return true;
|
||||
#else
|
||||
return _camera._stereoInfo.x > 0.0;
|
||||
#endif
|
||||
}
|
||||
|
||||
float cam_getStereoSide() {
|
||||
#ifdef GPU_TRANSFORM_IS_STEREO
|
||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||
return float(_stereoSide);
|
||||
#else
|
||||
return _camera._stereoInfo.y;
|
||||
#endif
|
||||
#else
|
||||
return _camera._stereoInfo.y;
|
||||
#endif
|
||||
}
|
||||
|
||||
<@endfunc@>
|
||||
|
||||
<@func declareStandardObjectTransform()@>
|
||||
struct TransformObject {
|
||||
|
|
Loading…
Reference in a new issue