mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 14:53:01 +02:00
Early work on batching stereo better
This commit is contained in:
parent
35aa074955
commit
d05e23b278
3 changed files with 40 additions and 9 deletions
|
@ -248,7 +248,10 @@ void GLBackend::render(Batch& batch) {
|
|||
if (!batch.isStereoEnabled()) {
|
||||
_stereo._enable = false;
|
||||
}
|
||||
_stereo._enable =batch.isStereoEnabled();
|
||||
|
||||
glEnable(GL_CLIP_DISTANCE0);
|
||||
|
||||
{
|
||||
PROFILE_RANGE("Transfer");
|
||||
renderPassTransfer(batch);
|
||||
|
@ -259,13 +262,15 @@ void GLBackend::render(Batch& batch) {
|
|||
renderPassDraw(batch);
|
||||
}
|
||||
|
||||
if (_stereo._enable) {
|
||||
/* if (_stereo._enable) {
|
||||
PROFILE_RANGE("RightRender");
|
||||
_stereo._pass = 1;
|
||||
renderPassDraw(batch);
|
||||
_stereo._pass = 0;
|
||||
}
|
||||
}*/
|
||||
|
||||
glDisable(GL_CLIP_DISTANCE0);
|
||||
|
||||
// Restore the saved stereo state for the next batch
|
||||
_stereo._enable = savedStereo;
|
||||
}
|
||||
|
@ -326,7 +331,12 @@ void GLBackend::do_draw(Batch& batch, size_t paramOffset) {
|
|||
GLenum mode = _primitiveToGLmode[primitiveType];
|
||||
uint32 numVertices = batch._params[paramOffset + 1]._uint;
|
||||
uint32 startVertex = batch._params[paramOffset + 0]._uint;
|
||||
glDrawArrays(mode, startVertex, numVertices);
|
||||
if (isStereo()) {
|
||||
glDrawArraysInstanced(mode, startVertex, numVertices, 2);
|
||||
} else {
|
||||
glDrawArrays(mode, startVertex, numVertices);
|
||||
}
|
||||
|
||||
(void) CHECK_GL_ERROR();
|
||||
}
|
||||
|
||||
|
@ -341,7 +351,11 @@ void GLBackend::do_drawIndexed(Batch& batch, size_t paramOffset) {
|
|||
auto typeByteSize = TYPE_SIZE[_input._indexBufferType];
|
||||
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
|
||||
|
||||
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
||||
if (isStereo()) {
|
||||
glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, 2);
|
||||
} else {
|
||||
glDrawElements(mode, numIndices, glType, indexBufferByteOffset);
|
||||
}
|
||||
(void) CHECK_GL_ERROR();
|
||||
}
|
||||
|
||||
|
@ -352,7 +366,7 @@ void GLBackend::do_drawInstanced(Batch& batch, size_t paramOffset) {
|
|||
uint32 numVertices = batch._params[paramOffset + 2]._uint;
|
||||
uint32 startVertex = batch._params[paramOffset + 1]._uint;
|
||||
|
||||
glDrawArraysInstancedARB(mode, startVertex, numVertices, numInstances);
|
||||
glDrawArraysInstancedARB(mode, startVertex, numVertices, (isStereo() ? 2 * numInstances : numInstances));
|
||||
(void) CHECK_GL_ERROR();
|
||||
}
|
||||
|
||||
|
@ -370,9 +384,9 @@ void GLBackend::do_drawIndexedInstanced(Batch& batch, size_t paramOffset) {
|
|||
GLvoid* indexBufferByteOffset = reinterpret_cast<GLvoid*>(startIndex * typeByteSize + _input._indexBufferOffset);
|
||||
|
||||
#if (GPU_INPUT_PROFILE == GPU_CORE_43)
|
||||
glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, numInstances, 0, startInstance);
|
||||
glDrawElementsInstancedBaseVertexBaseInstance(mode, numIndices, glType, indexBufferByteOffset, (isStereo() ? 2 * numInstances : numInstances), 0, startInstance);
|
||||
#else
|
||||
glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, numInstances);
|
||||
glDrawElementsInstanced(mode, numIndices, glType, indexBufferByteOffset, (isStereo() ? 2 * numInstances : numInstances));
|
||||
Q_UNUSED(startInstance);
|
||||
#endif
|
||||
(void)CHECK_GL_ERROR();
|
||||
|
|
|
@ -32,6 +32,7 @@ void GLBackend::do_setViewportTransform(Batch& batch, size_t paramOffset) {
|
|||
memcpy(&_transform._viewport, batch.editData(batch._params[paramOffset]._uint), sizeof(Vec4i));
|
||||
|
||||
ivec4& vp = _transform._viewport;
|
||||
glViewport(vp.x, vp.y, vp.z, vp.w);
|
||||
|
||||
// Where we assign the GL viewport
|
||||
if (_stereo._enable) {
|
||||
|
@ -41,7 +42,7 @@ void GLBackend::do_setViewportTransform(Batch& batch, size_t paramOffset) {
|
|||
}
|
||||
}
|
||||
|
||||
glViewport(vp.x, vp.y, vp.z, vp.w);
|
||||
// glViewport(vp.x, vp.y, vp.z, vp.w);
|
||||
|
||||
// The Viewport is tagged invalid because the CameraTransformUBO is not up to date and will need update on next drawcall
|
||||
_transform._invalidViewport = true;
|
||||
|
@ -213,7 +214,7 @@ void GLBackend::updateTransform(const Batch& batch) {
|
|||
glBindBuffer(GL_ARRAY_BUFFER, _transform._drawCallInfoBuffer);
|
||||
glVertexAttribIPointer(gpu::Stream::DRAW_CALL_INFO, 2, GL_UNSIGNED_SHORT, 0,
|
||||
_transform._drawCallInfoOffsets[batch._currentNamedCall]);
|
||||
glVertexAttribDivisor(gpu::Stream::DRAW_CALL_INFO, 1);
|
||||
glVertexAttribDivisor(gpu::Stream::DRAW_CALL_INFO, (isStereo() ? 2: 1));
|
||||
}
|
||||
|
||||
(void)CHECK_GL_ERROR();
|
||||
|
|
|
@ -76,6 +76,18 @@ TransformObject getTransformObject() {
|
|||
<$viewport$> = <$cameraTransform$>._viewport;
|
||||
<@endfunc@>
|
||||
|
||||
<@func transformStereoClipsSpace(cameraTransform, clipPos)@>
|
||||
{
|
||||
vec4 eyeClipEdge[2]= vec4[2](vec4(-1,0,0,1), vec4(1,0,0,1));
|
||||
vec2 eyeOffsetScale = vec2(-0.5, +0.5);
|
||||
uint eyeIndex = gl_InstanceID % 2;
|
||||
gl_ClipDistance[0] = dot(<$clipPos$>, eyeClipEdge[eyeIndex]);
|
||||
float newClipPosX = <$clipPos$>.x * 0.5 + eyeOffsetScale[eyeIndex] * <$clipPos$>.w;
|
||||
<$clipPos$>.x = newClipPosX;
|
||||
}
|
||||
<@endfunc@>
|
||||
|
||||
|
||||
<@func transformModelToEyeWorldAlignedPos(cameraTransform, objectTransform, modelPos, eyeWorldAlignedPos)@>
|
||||
<!// Bring the model pos in the world aligned space centered on the eye axis !>
|
||||
{ // _transformModelToEyeWorldAlignedPos
|
||||
|
@ -92,6 +104,8 @@ TransformObject getTransformObject() {
|
|||
<$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$>
|
||||
|
||||
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos;
|
||||
|
||||
<$transformStereoClipsSpace($cameraTransform$, $clipPos$)$>
|
||||
}
|
||||
<@endfunc@>
|
||||
|
||||
|
@ -101,6 +115,8 @@ TransformObject getTransformObject() {
|
|||
<$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$>
|
||||
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos;
|
||||
<$eyePos$> = vec4((<$cameraTransform$>._view * vec4(eyeWAPos.xyz, 0.0)).xyz, 1.0);
|
||||
|
||||
<$transformStereoClipsSpace($cameraTransform$, $clipPos$)$>
|
||||
}
|
||||
<@endfunc@>
|
||||
|
||||
|
|
Loading…
Reference in a new issue