mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 05:58:27 +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
|
#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
|
#endif
|
||||||
|
|
||||||
void GLBackend::do_resetStages(const Batch& batch, size_t paramOffset) {
|
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
|
// As long as we don;t use several versions of shaders we can avoid this more complex code path
|
||||||
#ifdef GPU_STEREO_CAMERA_BUFFER
|
#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
|
#else
|
||||||
#define GET_UNIFORM_LOCATION(shaderUniformLoc) shaderUniformLoc
|
#define GET_UNIFORM_LOCATION(shaderUniformLoc) shaderUniformLoc
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,9 +31,9 @@
|
||||||
|
|
||||||
|
|
||||||
// Pick one from the 3: THis version is the most efficient as of now
|
// 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_DOUBLED_SMARTER
|
||||||
//#define GPU_STEREO_TECHNIQUE_INSTANCED
|
#define GPU_STEREO_TECHNIQUE_INSTANCED
|
||||||
|
|
||||||
|
|
||||||
// Let these be configured by the one define picked above
|
// 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
|
// check the program cache
|
||||||
// pick the program version
|
// pick the program version
|
||||||
#ifdef GPU_STEREO_CAMERA_BUFFER
|
#ifdef GPU_STEREO_CAMERA_BUFFER
|
||||||
GLuint glprogram = pipelineObject->_program->getProgram(isStereo());
|
GLuint glprogram = pipelineObject->_program->getProgram((GLShader::Version) isStereo());
|
||||||
#else
|
#else
|
||||||
GLuint glprogram = pipelineObject->_program->getProgram();
|
GLuint glprogram = pipelineObject->_program->getProgram();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -25,11 +25,14 @@ void GL41Backend::do_draw(const Batch& batch, size_t paramOffset) {
|
||||||
uint32 startVertex = batch._params[paramOffset + 0]._uint;
|
uint32 startVertex = batch._params[paramOffset + 0]._uint;
|
||||||
|
|
||||||
if (isStereo()) {
|
if (isStereo()) {
|
||||||
|
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||||
|
glDrawArraysInstanced(mode, startVertex, numVertices, 2);
|
||||||
|
#else
|
||||||
setupStereoSide(0);
|
setupStereoSide(0);
|
||||||
glDrawArrays(mode, startVertex, numVertices);
|
glDrawArrays(mode, startVertex, numVertices);
|
||||||
setupStereoSide(1);
|
setupStereoSide(1);
|
||||||
glDrawArrays(mode, startVertex, numVertices);
|
glDrawArrays(mode, startVertex, numVertices);
|
||||||
|
#endif
|
||||||
_stats._DSNumTriangles += 2 * numVertices / 3;
|
_stats._DSNumTriangles += 2 * numVertices / 3;
|
||||||
_stats._DSNumDrawcalls += 2;
|
_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);
|
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
|
||||||
|
|
||||||
if (isStereo()) {
|
if (isStereo()) {
|
||||||
|
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||||
|
glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, 2);
|
||||||
|
#else
|
||||||
setupStereoSide(0);
|
setupStereoSide(0);
|
||||||
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
||||||
setupStereoSide(1);
|
setupStereoSide(1);
|
||||||
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
||||||
|
#endif
|
||||||
_stats._DSNumTriangles += 2 * numIndices / 3;
|
_stats._DSNumTriangles += 2 * numIndices / 3;
|
||||||
_stats._DSNumDrawcalls += 2;
|
_stats._DSNumDrawcalls += 2;
|
||||||
} else {
|
} else {
|
||||||
|
@ -83,11 +89,14 @@ void GL41Backend::do_drawInstanced(const Batch& batch, size_t paramOffset) {
|
||||||
if (isStereo()) {
|
if (isStereo()) {
|
||||||
GLint trueNumInstances = 2 * numInstances;
|
GLint trueNumInstances = 2 * numInstances;
|
||||||
|
|
||||||
|
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||||
|
glDrawArraysInstanced(mode, startVertex, numVertices, trueNumInstances);
|
||||||
|
#else
|
||||||
setupStereoSide(0);
|
setupStereoSide(0);
|
||||||
glDrawArraysInstancedARB(mode, startVertex, numVertices, numInstances);
|
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
|
||||||
setupStereoSide(1);
|
setupStereoSide(1);
|
||||||
glDrawArraysInstancedARB(mode, startVertex, numVertices, numInstances);
|
glDrawArraysInstanced(mode, startVertex, numVertices, numInstances);
|
||||||
|
#endif
|
||||||
_stats._DSNumTriangles += (trueNumInstances * numVertices) / 3;
|
_stats._DSNumTriangles += (trueNumInstances * numVertices) / 3;
|
||||||
_stats._DSNumDrawcalls += trueNumInstances;
|
_stats._DSNumDrawcalls += trueNumInstances;
|
||||||
} else {
|
} else {
|
||||||
|
@ -124,10 +133,14 @@ void GL41Backend::do_drawIndexedInstanced(const Batch& batch, size_t paramOffset
|
||||||
if (isStereo()) {
|
if (isStereo()) {
|
||||||
GLint trueNumInstances = 2 * numInstances;
|
GLint trueNumInstances = 2 * numInstances;
|
||||||
|
|
||||||
|
#ifdef GPU_STEREO_DRAWCALL_INSTANCED
|
||||||
|
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, trueNumInstances, 0, startInstance);
|
||||||
|
#else
|
||||||
setupStereoSide(0);
|
setupStereoSide(0);
|
||||||
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
||||||
setupStereoSide(1);
|
setupStereoSide(1);
|
||||||
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
glbackend_glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
||||||
|
#endif
|
||||||
|
|
||||||
_stats._DSNumTriangles += (trueNumInstances * numIndices) / 3;
|
_stats._DSNumTriangles += (trueNumInstances * numIndices) / 3;
|
||||||
_stats._DSNumDrawcalls += trueNumInstances;
|
_stats._DSNumDrawcalls += trueNumInstances;
|
||||||
|
|
|
@ -18,6 +18,7 @@ struct TransformCamera {
|
||||||
mat4 _projection;
|
mat4 _projection;
|
||||||
mat4 _projectionInverse;
|
mat4 _projectionInverse;
|
||||||
vec4 _viewport;
|
vec4 _viewport;
|
||||||
|
vec4 _stereoInfo;
|
||||||
};
|
};
|
||||||
|
|
||||||
layout(std140) uniform transformCameraBuffer {
|
layout(std140) uniform transformCameraBuffer {
|
||||||
|
@ -32,7 +33,7 @@ layout(std140) uniform transformCameraBuffer {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef VERTEX_SHADER
|
#ifdef GPU_VERTEX_SHADER
|
||||||
#ifdef GPU_TRANSFORM_IS_STEREO
|
#ifdef GPU_TRANSFORM_IS_STEREO
|
||||||
|
|
||||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||||
|
@ -47,7 +48,7 @@ flat out int _stereoSide;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PIXEL_SHADER
|
#ifdef GPU_PIXEL_SHADER
|
||||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||||
flat in int _stereoSide;
|
flat in int _stereoSide;
|
||||||
#endif
|
#endif
|
||||||
|
@ -56,7 +57,7 @@ flat in int _stereoSide;
|
||||||
TransformCamera getTransformCamera() {
|
TransformCamera getTransformCamera() {
|
||||||
#ifdef GPU_TRANSFORM_IS_STEREO
|
#ifdef GPU_TRANSFORM_IS_STEREO
|
||||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
#ifdef GPU_TRANSFORM_STEREO_CAMERA
|
||||||
#ifdef VERTEX_SHADER
|
#ifdef GPU_VERTEX_SHADER
|
||||||
#ifdef GPU_TRANSFORM_STEREO_CAMERA_ATTRIBUTED
|
#ifdef GPU_TRANSFORM_STEREO_CAMERA_ATTRIBUTED
|
||||||
_stereoSide = _inStereoSide;
|
_stereoSide = _inStereoSide;
|
||||||
#endif
|
#endif
|
||||||
|
@ -72,8 +73,32 @@ TransformCamera getTransformCamera() {
|
||||||
return _camera;
|
return _camera;
|
||||||
#endif
|
#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()@>
|
<@func declareStandardObjectTransform()@>
|
||||||
struct TransformObject {
|
struct TransformObject {
|
||||||
|
|
Loading…
Reference in a new issue