Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Laszlo Agocs
qtrhi
Commits
5f24ae0a
Commit
5f24ae0a
authored
Mar 19, 2019
by
Laszlo Agocs
Browse files
Reintroduce a simpler, still broken shadowmap example
parent
05bc4e93
Changes
14
Hide whitespace changes
Inline
Side-by-side
examples/rhi/rhi.pro
View file @
5f24ae0a
...
...
@@ -14,7 +14,8 @@ SUBDIRS += \
triquadcube
\
offscreen
\
floattexture
\
mrt
mrt
\
shadowmap
qtConfig
(
vulkan
)
{
SUBDIRS
+=
\
...
...
examples/rhi/shadowmap/buildshaders.bat
0 → 100644
View file @
5f24ae0a
qsb
--glsl
120
--hlsl
50
--msl
12
-c
shadowmap
.vert
-o
shadowmap
.vert.qsb
qsb
--glsl
120
--hlsl
50
--msl
12
-c
shadowmap
.frag
-o
shadowmap
.frag.qsb
qsb
--glsl
120
--hlsl
50
--msl
12
-c
light
.vert
-o
light
.vert.qsb
qsb
--glsl
120
--hlsl
50
--msl
12
-c
light
.frag
-o
light
.frag.qsb
examples/rhi/shadowmap/light.frag
0 → 100644
View file @
5f24ae0a
#version 440
layout
(
location
=
0
)
in
vec4
vLCVertPos
;
layout
(
location
=
0
)
out
vec4
fragColor
;
layout
(
binding
=
1
)
uniform
sampler2DShadow
shadowMap
;
layout
(
std140
,
binding
=
0
)
uniform
buf
{
mat4
mvp
;
mat4
lightMvp
;
int
useShadow
;
}
ubuf
;
void
main
()
{
vec4
adjustedLcVertPos
=
vLCVertPos
;
adjustedLcVertPos
.
z
-=
0
.
0001
;
// bias to avoid acne
float
sc
=
textureProj
(
shadowMap
,
adjustedLcVertPos
);
float
shadowFactor
=
0
.
2
;
if
(
sc
>
0
||
ubuf
.
useShadow
==
0
)
shadowFactor
=
1
.
0
;
fragColor
=
vec4
(
0
.
5
,
0
.
3
+
ubuf
.
useShadow
*
0
.
2
,
0
.
7
,
1
.
0
)
*
shadowFactor
;
}
examples/rhi/shadowmap/light.frag.qsb
0 → 100644
View file @
5f24ae0a
File added
examples/rhi/shadowmap/light.vert
0 → 100644
View file @
5f24ae0a
#version 440
layout
(
location
=
0
)
in
vec4
position
;
layout
(
std140
,
binding
=
0
)
uniform
buf
{
mat4
mvp
;
mat4
lightMvp
;
int
useShadow
;
}
ubuf
;
out
gl_PerVertex
{
vec4
gl_Position
;
};
layout
(
location
=
0
)
out
vec4
vLCVertPos
;
void
main
()
{
// [-1,1] -> [0,1]
mat4
shadowMatrix
=
mat4
(
0
.
5
,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
5
,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
5
,
0
.
0
,
0
.
5
,
0
.
5
,
0
.
5
,
1
.
0
);
vLCVertPos
=
shadowMatrix
*
ubuf
.
lightMvp
*
position
;
gl_Position
=
ubuf
.
mvp
*
position
;
}
examples/rhi/shadowmap/light.vert.qsb
0 → 100644
View file @
5f24ae0a
File added
examples/rhi/shadowmap/shadowmap.cpp
0 → 100644
View file @
5f24ae0a
/****************************************************************************
**
** Copyright (C) 2018 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../shared/examplefw.h"
#include "../shared/cube.h"
// Depth texture / shadow sampler / shadow map example.
// Not available on GLES 2.0.
static
float
quadVertexData
[]
=
{
// Y up, CCW, x-y-z
-
0.5
f
,
0.5
f
,
0.0
f
,
-
0.5
f
,
-
0.5
f
,
0.0
f
,
0.5
f
,
-
0.5
f
,
0.0
f
,
0.5
f
,
0.5
f
,
0.0
f
,
};
static
quint16
quadIndexData
[]
=
{
0
,
1
,
2
,
0
,
2
,
3
};
struct
{
QVector
<
QRhiResource
*>
releasePool
;
QRhiBuffer
*
vbuf
=
nullptr
;
QRhiBuffer
*
ibuf
=
nullptr
;
QRhiBuffer
*
ubuf
=
nullptr
;
QRhiSampler
*
shadowSampler
=
nullptr
;
QRhiShaderResourceBindings
*
srb
=
nullptr
;
QRhiGraphicsPipeline
*
ps
=
nullptr
;
QRhiResourceUpdateBatch
*
initialUpdates
=
nullptr
;
QMatrix4x4
winProj
;
float
cubeRot
=
0
;
QRhiTextureRenderTarget
*
rt
=
nullptr
;
QRhiRenderPassDescriptor
*
rtRp
=
nullptr
;
QRhiTexture
*
shadowMap
=
nullptr
;
QRhiShaderResourceBindings
*
shadowSrb
=
nullptr
;
QRhiGraphicsPipeline
*
shadowPs
=
nullptr
;
}
d
;
const
int
UBLOCK_SIZE
=
64
*
2
+
4
;
const
int
SHADOW_UBLOCK_SIZE
=
64
*
1
;
const
int
UBUF_SLOTS
=
4
;
// 2 objects * 2 passes with different cameras
void
Window
::
customInit
()
{
if
(
!
m_r
->
isTextureFormatSupported
(
QRhiTexture
::
D32F
))
qFatal
(
"Depth texture is not supported"
);
d
.
vbuf
=
m_r
->
newBuffer
(
QRhiBuffer
::
Immutable
,
QRhiBuffer
::
VertexBuffer
,
sizeof
(
quadVertexData
)
+
sizeof
(
cube
));
d
.
vbuf
->
build
();
d
.
releasePool
<<
d
.
vbuf
;
d
.
ibuf
=
m_r
->
newBuffer
(
QRhiBuffer
::
Immutable
,
QRhiBuffer
::
IndexBuffer
,
sizeof
(
quadIndexData
));
d
.
ibuf
->
build
();
d
.
releasePool
<<
d
.
ibuf
;
const
int
oneRoundedUniformBlockSize
=
m_r
->
ubufAligned
(
UBLOCK_SIZE
);
d
.
ubuf
=
m_r
->
newBuffer
(
QRhiBuffer
::
Dynamic
,
QRhiBuffer
::
UniformBuffer
,
UBUF_SLOTS
*
oneRoundedUniformBlockSize
);
d
.
ubuf
->
build
();
d
.
releasePool
<<
d
.
ubuf
;
d
.
shadowMap
=
m_r
->
newTexture
(
QRhiTexture
::
D32F
,
QSize
(
1024
,
1024
),
1
,
QRhiTexture
::
RenderTarget
);
d
.
releasePool
<<
d
.
shadowMap
;
d
.
shadowMap
->
build
();
d
.
shadowSampler
=
m_r
->
newSampler
(
QRhiSampler
::
Linear
,
QRhiSampler
::
Linear
,
QRhiSampler
::
None
,
QRhiSampler
::
ClampToEdge
,
QRhiSampler
::
ClampToEdge
);
d
.
releasePool
<<
d
.
shadowSampler
;
d
.
shadowSampler
->
setTextureCompareOp
(
QRhiSampler
::
Less
);
d
.
shadowSampler
->
build
();
d
.
srb
=
m_r
->
newShaderResourceBindings
();
d
.
releasePool
<<
d
.
srb
;
const
QRhiShaderResourceBinding
::
StageFlags
stages
=
QRhiShaderResourceBinding
::
VertexStage
|
QRhiShaderResourceBinding
::
FragmentStage
;
d
.
srb
->
setBindings
({
QRhiShaderResourceBinding
::
uniformBufferWithDynamicOffset
(
0
,
stages
,
d
.
ubuf
,
UBLOCK_SIZE
),
QRhiShaderResourceBinding
::
sampledTexture
(
1
,
QRhiShaderResourceBinding
::
FragmentStage
,
d
.
shadowMap
,
d
.
shadowSampler
)
});
d
.
srb
->
build
();
d
.
ps
=
m_r
->
newGraphicsPipeline
();
d
.
releasePool
<<
d
.
ps
;
d
.
ps
->
setShaderStages
({
{
QRhiGraphicsShaderStage
::
Vertex
,
getShader
(
QLatin1String
(
":/light.vert.qsb"
))
},
{
QRhiGraphicsShaderStage
::
Fragment
,
getShader
(
QLatin1String
(
":/light.frag.qsb"
))
}
});
d
.
ps
->
setDepthTest
(
true
);
d
.
ps
->
setDepthWrite
(
true
);
// fits both the quad and cube vertex data
QRhiVertexInputLayout
inputLayout
;
inputLayout
.
setBindings
({
{
3
*
sizeof
(
float
)
}
});
inputLayout
.
setAttributes
({
{
0
,
0
,
QRhiVertexInputAttribute
::
Float3
,
0
},
});
d
.
ps
->
setVertexInputLayout
(
inputLayout
);
d
.
ps
->
setShaderResourceBindings
(
d
.
srb
);
d
.
ps
->
setRenderPassDescriptor
(
m_rp
);
d
.
ps
->
build
();
d
.
initialUpdates
=
m_r
->
nextResourceUpdateBatch
();
d
.
initialUpdates
->
uploadStaticBuffer
(
d
.
vbuf
,
0
,
sizeof
(
quadVertexData
),
quadVertexData
);
d
.
initialUpdates
->
uploadStaticBuffer
(
d
.
vbuf
,
sizeof
(
quadVertexData
),
sizeof
(
cube
),
cube
);
d
.
initialUpdates
->
uploadStaticBuffer
(
d
.
ibuf
,
quadIndexData
);
QRhiTextureRenderTargetDescription
rtDesc
;
rtDesc
.
setDepthTexture
(
d
.
shadowMap
);
d
.
rt
=
m_r
->
newTextureRenderTarget
(
rtDesc
);
d
.
releasePool
<<
d
.
rt
;
d
.
rtRp
=
d
.
rt
->
newCompatibleRenderPassDescriptor
();
d
.
releasePool
<<
d
.
rtRp
;
d
.
rt
->
setRenderPassDescriptor
(
d
.
rtRp
);
d
.
rt
->
build
();
d
.
shadowSrb
=
m_r
->
newShaderResourceBindings
();
d
.
releasePool
<<
d
.
shadowSrb
;
d
.
shadowSrb
->
setBindings
({
QRhiShaderResourceBinding
::
uniformBufferWithDynamicOffset
(
0
,
stages
,
d
.
ubuf
,
SHADOW_UBLOCK_SIZE
)
});
d
.
shadowSrb
->
build
();
d
.
shadowPs
=
m_r
->
newGraphicsPipeline
();
d
.
releasePool
<<
d
.
shadowPs
;
d
.
shadowPs
->
setShaderStages
({
{
QRhiGraphicsShaderStage
::
Vertex
,
getShader
(
QLatin1String
(
":/shadowmap.vert.qsb"
))
},
{
QRhiGraphicsShaderStage
::
Fragment
,
getShader
(
QLatin1String
(
":/shadowmap.frag.qsb"
))
}
});
d
.
shadowPs
->
setDepthTest
(
true
);
d
.
shadowPs
->
setDepthWrite
(
true
);
inputLayout
.
setBindings
({
{
3
*
sizeof
(
float
)
}
});
inputLayout
.
setAttributes
({
{
0
,
0
,
QRhiVertexInputAttribute
::
Float3
,
0
}
});
d
.
shadowPs
->
setVertexInputLayout
(
inputLayout
);
d
.
shadowPs
->
setShaderResourceBindings
(
d
.
shadowSrb
);
d
.
shadowPs
->
setRenderPassDescriptor
(
d
.
rtRp
);
d
.
shadowPs
->
build
();
}
void
Window
::
customRelease
()
{
for
(
QRhiResource
*
r
:
d
.
releasePool
)
r
->
releaseAndDestroy
();
d
.
releasePool
.
clear
();
}
static
void
enqueueScene
(
QRhiCommandBuffer
*
cb
,
QRhiShaderResourceBindings
*
srb
,
int
oneRoundedUniformBlockSize
,
int
firstUbufSlot
)
{
// draw the ground (the quad)
cb
->
setShaderResources
(
srb
,
{
{
0
,
quint32
(
firstUbufSlot
*
oneRoundedUniformBlockSize
)
}
});
cb
->
setVertexInput
(
0
,
{
{
d
.
vbuf
,
0
}
},
d
.
ibuf
,
0
,
QRhiCommandBuffer
::
IndexUInt16
);
cb
->
drawIndexed
(
6
);
// Draw the object (the cube). Both vertex and uniform data are in the same
// buffer, right after the quad's.
cb
->
setShaderResources
(
srb
,
{
qMakePair
(
0
,
quint32
((
firstUbufSlot
+
1
)
*
oneRoundedUniformBlockSize
))
});
cb
->
setVertexInput
(
0
,
{
{
d
.
vbuf
,
sizeof
(
quadVertexData
)
}
});
cb
->
draw
(
36
);
}
void
Window
::
customRender
()
{
const
QSize
outputSizeInPixels
=
m_sc
->
currentPixelSize
();
QRhiCommandBuffer
*
cb
=
m_sc
->
currentFrameCommandBuffer
();
QRhiResourceUpdateBatch
*
u
=
m_r
->
nextResourceUpdateBatch
();
if
(
d
.
initialUpdates
)
{
u
->
merge
(
d
.
initialUpdates
);
d
.
initialUpdates
->
release
();
d
.
initialUpdates
=
nullptr
;
}
const
int
oneRoundedUniformBlockSize
=
m_r
->
ubufAligned
(
UBLOCK_SIZE
);
const
QVector3D
lightPos
(
5
,
10
,
10
);
QMatrix4x4
lightViewProj
=
m_r
->
clipSpaceCorrMatrix
();
lightViewProj
.
perspective
(
45.0
f
,
1
,
0.1
f
,
100.0
f
);
lightViewProj
.
lookAt
(
lightPos
,
QVector3D
(
0
,
0
,
0
),
QVector3D
(
0
,
1
,
0
));
// uniform data for the ground
if
(
d
.
winProj
!=
m_proj
)
{
d
.
winProj
=
m_proj
;
QMatrix4x4
m
;
m
.
scale
(
4.0
f
);
m
.
rotate
(
-
60
,
1
,
0
,
0
);
// for the main pass
const
QMatrix4x4
mvp
=
m_proj
*
m
;
// m_proj is in fact projection * view
u
->
updateDynamicBuffer
(
d
.
ubuf
,
0
,
64
,
mvp
.
constData
());
const
QMatrix4x4
shadowMvp
=
lightViewProj
*
m
;
u
->
updateDynamicBuffer
(
d
.
ubuf
,
64
,
64
,
shadowMvp
.
constData
());
qint32
useShadows
=
1
;
u
->
updateDynamicBuffer
(
d
.
ubuf
,
128
,
4
,
&
useShadows
);
// for the shadow pass
u
->
updateDynamicBuffer
(
d
.
ubuf
,
2
*
oneRoundedUniformBlockSize
,
64
,
shadowMvp
.
constData
());
}
// uniform data for the rotating cube
QMatrix4x4
m
;
m
.
translate
(
0
,
0.5
f
,
2
);
m
.
scale
(
0.2
f
);
m
.
rotate
(
d
.
cubeRot
,
0
,
1
,
0
);
m
.
rotate
(
45
,
1
,
0
,
0
);
d
.
cubeRot
+=
1
;
// for the main pass
const
QMatrix4x4
mvp
=
m_proj
*
m
;
u
->
updateDynamicBuffer
(
d
.
ubuf
,
oneRoundedUniformBlockSize
,
64
,
mvp
.
constData
());
const
QMatrix4x4
shadowMvp
=
lightViewProj
*
m
;
u
->
updateDynamicBuffer
(
d
.
ubuf
,
oneRoundedUniformBlockSize
+
64
,
64
,
shadowMvp
.
constData
());
qint32
useShadows
=
0
;
u
->
updateDynamicBuffer
(
d
.
ubuf
,
oneRoundedUniformBlockSize
+
128
,
4
,
&
useShadows
);
// for the shadow pass
u
->
updateDynamicBuffer
(
d
.
ubuf
,
3
*
oneRoundedUniformBlockSize
,
64
,
shadowMvp
.
constData
());
cb
->
resourceUpdate
(
u
);
// shadow pass
const
QSize
shadowMapSize
=
d
.
shadowMap
->
pixelSize
();
cb
->
beginPass
(
d
.
rt
,
QRhiColorClearValue
(),
{
1.0
f
,
0
});
cb
->
setGraphicsPipeline
(
d
.
shadowPs
);
cb
->
setViewport
({
0
,
0
,
float
(
shadowMapSize
.
width
()),
float
(
shadowMapSize
.
height
())
});
enqueueScene
(
cb
,
d
.
shadowSrb
,
oneRoundedUniformBlockSize
,
2
);
cb
->
endPass
();
// main pass
cb
->
beginPass
(
m_sc
->
currentFrameRenderTarget
(),
{
0.4
f
,
0.7
f
,
0.0
f
,
1.0
f
},
{
1.0
f
,
0
});
cb
->
setGraphicsPipeline
(
d
.
ps
);
cb
->
setViewport
({
0
,
0
,
float
(
outputSizeInPixels
.
width
()),
float
(
outputSizeInPixels
.
height
())
});
enqueueScene
(
cb
,
d
.
srb
,
oneRoundedUniformBlockSize
,
0
);
cb
->
endPass
();
}
examples/rhi/shadowmap/shadowmap.frag
0 → 100644
View file @
5f24ae0a
#version 440
void
main
()
{
}
examples/rhi/shadowmap/shadowmap.frag.qsb
0 → 100644
View file @
5f24ae0a
File added
examples/rhi/shadowmap/shadowmap.pro
0 → 100644
View file @
5f24ae0a
TEMPLATE
=
app
QT
+=
rhi
SOURCES
=
\
shadowmap
.
cpp
RESOURCES
=
shadowmap
.
qrc
target
.
path
=
$$
[
QT_INSTALL_EXAMPLES
]
/
rhi
/
shadowmap
INSTALLS
+=
target
examples/rhi/shadowmap/shadowmap.qrc
0 → 100644
View file @
5f24ae0a
<!DOCTYPE RCC>
<RCC
version=
"1.0"
>
<qresource>
<file>
shadowmap.vert.qsb
</file>
<file>
shadowmap.frag.qsb
</file>
<file>
light.vert.qsb
</file>
<file>
light.frag.qsb
</file>
</qresource>
</RCC>
examples/rhi/shadowmap/shadowmap.vert
0 → 100644
View file @
5f24ae0a
#version 440
layout
(
location
=
0
)
in
vec4
position
;
layout
(
std140
,
binding
=
0
)
uniform
buf
{
mat4
mvp
;
}
ubuf
;
out
gl_PerVertex
{
vec4
gl_Position
;
};
void
main
()
{
gl_Position
=
ubuf
.
mvp
*
position
;
}
examples/rhi/shadowmap/shadowmap.vert.qsb
0 → 100644
View file @
5f24ae0a
File added
examples/rhi/shared/examplefw.h
View file @
5f24ae0a
...
...
@@ -157,7 +157,6 @@ protected:
QRhiRenderPassDescriptor
*
m_rp
=
nullptr
;
QMatrix4x4
m_proj
;
QMatrix4x4
m_rawProj
;
QElapsedTimer
m_timer
;
int
m_frameCount
;
...
...
@@ -338,9 +337,8 @@ void Window::resizeSwapChain()
m_frameCount
=
0
;
m_timer
.
restart
();
m_rawProj
.
setToIdentity
();
m_rawProj
.
perspective
(
45.0
f
,
outputSize
.
width
()
/
(
float
)
outputSize
.
height
(),
0.01
f
,
1000.0
f
);
m_proj
=
m_r
->
clipSpaceCorrMatrix
()
*
m_rawProj
;
m_proj
=
m_r
->
clipSpaceCorrMatrix
();
m_proj
.
perspective
(
45.0
f
,
outputSize
.
width
()
/
(
float
)
outputSize
.
height
(),
0.01
f
,
1000.0
f
);
m_proj
.
translate
(
0
,
0
,
-
4
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment