Skip to content

Commit 79d7465

Browse files
committed
[feature] 增加若干示例,迭代版本到Qt6.6.0
1 parent 9d124c4 commit 79d7465

166 files changed

Lines changed: 29107 additions & 1002 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ comments: true
7575
- 图形技术
7676
- [ ] 样条线
7777
- [ ] 文字渲染
78+
- [x] 天空盒
7879
- [x] 静态网格体
7980
- [x] 骨骼网格体及骨骼动画
80-
- [x] 天空盒
8181
- [x] GPU粒子
8282
- [ ] Shader Toy
8383
- [ ] 后期滤镜

Source/0-QEngineUtilities

Submodule 0-QEngineUtilities updated 3824 files

Source/1-GraphicsAPI/02-GraphicRenderingPipeline/Source/TriangleWindow.h

Lines changed: 0 additions & 123 deletions
This file was deleted.

Source/1-GraphicsAPI/02-GraphicRenderingPipeline/Source/main.cpp

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,122 @@
11
#include <QApplication>
2-
#include "TriangleWindow.h"
2+
#include "Render/RHI/QRhiWindow.h"
3+
4+
static float VertexData[] = {
5+
//position(xy) color(rgba)
6+
0.0f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f,
7+
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f,
8+
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f,
9+
};
10+
11+
class TriangleWindow : public QRhiWindow {
12+
private:
13+
QRhiEx::Signal sigInit;
14+
QRhiEx::Signal sigSubmit;
15+
QScopedPointer<QRhiBuffer> mVertexBuffer;
16+
QScopedPointer<QRhiShaderResourceBindings> mShaderBindings;
17+
QScopedPointer<QRhiGraphicsPipeline> mPipeline;
18+
public:
19+
TriangleWindow(QRhiWindow::InitParams inInitParams) :QRhiWindow(inInitParams) {
20+
sigInit.request();
21+
sigSubmit.request();
22+
}
23+
protected:
24+
void initRhiResource() {
25+
mVertexBuffer.reset(mRhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(VertexData)));
26+
mVertexBuffer->create();
27+
28+
mShaderBindings.reset(mRhi->newShaderResourceBindings()); //创建绑定
29+
mShaderBindings->create();
30+
31+
mPipeline.reset(mRhi->newGraphicsPipeline());
32+
33+
mPipeline->setShaderResourceBindings(mShaderBindings.get()); //绑定到流水线中华
34+
35+
QRhiGraphicsPipeline::TargetBlend targetBlend;
36+
targetBlend.enable = false;
37+
mPipeline->setTargetBlends({ QRhiGraphicsPipeline::TargetBlend() });
38+
39+
mPipeline->setSampleCount(mSwapChain->sampleCount());
40+
41+
mPipeline->setDepthTest(false);
42+
mPipeline->setDepthOp(QRhiGraphicsPipeline::Always);
43+
mPipeline->setDepthWrite(false);
44+
45+
46+
QRhiVertexInputLayout inputLayout;
47+
inputLayout.setBindings({
48+
QRhiVertexInputBinding(6 * sizeof(float)) //定义每个VertexBuffer,单组顶点数据的跨度,这里是 6 * sizeof(float),可以当作是GPU会从Buffer0(0是Index)读取 6 * sizeof(float) 传给 Vertex Shader
49+
});
50+
51+
inputLayout.setAttributes({
52+
QRhiVertexInputAttribute(0, 0 , QRhiVertexInputAttribute::Float2, 0), // 从每组顶点数据的位置 0 开始作为 Location0(Float2) 的起始地址
53+
QRhiVertexInputAttribute(0, 1 , QRhiVertexInputAttribute::Float4, sizeof(float) * 2), // 从每组顶点数据的位置 sizeof(float) * 2 开始作为 Location1(Float4) 的起始地址
54+
});
55+
56+
mPipeline->setVertexInputLayout(inputLayout);
57+
58+
QShader vs = mRhi->newShaderFromCode(QShader::VertexStage, R"(#version 440
59+
layout(location = 0) in vec2 position; //这里需要与上面的inputLayout 对应
60+
layout(location = 1) in vec4 color;
61+
62+
layout (location = 0) out vec4 vColor; //输出变量到 fragment shader 中,这里的location是out的,而不是in
63+
64+
out gl_PerVertex {
65+
vec4 gl_Position;
66+
};
67+
68+
void main(){
69+
gl_Position = vec4(position,0.0f,1.0f);
70+
vColor = color;
71+
}
72+
)");
73+
Q_ASSERT(vs.isValid());
74+
75+
QShader fs = mRhi->newShaderFromCode(QShader::FragmentStage, R"(#version 440
76+
layout (location = 0) in vec4 vColor; //上一阶段的out变成了这一阶段的in
77+
layout (location = 0) out vec4 fragColor;
78+
void main(){
79+
fragColor = vColor;
80+
}
81+
)");
82+
Q_ASSERT(fs.isValid());
83+
84+
mPipeline->setShaderStages({
85+
QRhiShaderStage(QRhiShaderStage::Vertex, vs),
86+
QRhiShaderStage(QRhiShaderStage::Fragment, fs)
87+
});
88+
mPipeline->setRenderPassDescriptor(mSwapChainPassDesc.get());
89+
mPipeline->create();
90+
}
91+
92+
virtual void onRenderTick() override {
93+
QRhiRenderTarget* currentRenderTarget = mSwapChain->currentFrameRenderTarget();
94+
QRhiCommandBuffer* currentCmdBuffer = mSwapChain->currentFrameCommandBuffer();
95+
96+
if (sigInit.receive()) {
97+
initRhiResource();
98+
}
99+
QRhiResourceUpdateBatch* resourceUpdates = nullptr;
100+
if (sigSubmit.receive()) {
101+
resourceUpdates = mRhi->nextResourceUpdateBatch();
102+
resourceUpdates->uploadStaticBuffer(mVertexBuffer.get(), VertexData); //上传顶点数据
103+
}
104+
105+
const QColor clearColor = QColor::fromRgbF(0.2f, 0.2f, 0.2f, 1.0f);
106+
const QRhiDepthStencilClearValue dsClearValue = { 1.0f,0 };
107+
108+
currentCmdBuffer->beginPass(currentRenderTarget, clearColor, dsClearValue, resourceUpdates);
109+
110+
currentCmdBuffer->setGraphicsPipeline(mPipeline.get());
111+
currentCmdBuffer->setViewport(QRhiViewport(0, 0, mSwapChain->currentPixelSize().width(), mSwapChain->currentPixelSize().height()));
112+
currentCmdBuffer->setShaderResources();
113+
const QRhiCommandBuffer::VertexInput vertexBindings(mVertexBuffer.get(), 0); //将 mVertexBuffer 绑定到Buffer0,内存偏移值为0
114+
currentCmdBuffer->setVertexInput(0, 1, &vertexBindings);
115+
currentCmdBuffer->draw(3);
116+
117+
currentCmdBuffer->endPass();
118+
}
119+
};
3120

4121
int main(int argc, char **argv)
5122
{

Source/1-GraphicsAPI/03-Shader/Source/main.cpp

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,30 @@
33
#include <QFile>
44
#include <QDir>
55
#include "private/qshaderbaker_p.h"
6+
#include "QWidget"
7+
#include "QTextEdit"
8+
#include "QTextBrowser"
9+
#include "QBoxLayout"
10+
#include "QPushButton"
11+
#include "QLabel"
612

7-
QShader newShaderFromCode(QShader::Stage stage, const char* code) {
13+
QShader createShaderFromCode(QShader::Stage stage, const char* code) {
814
QShaderBaker baker;
915
baker.setGeneratedShaderVariants({ QShader::StandardShader });
1016
baker.setGeneratedShaders({
11-
QShaderBaker::GeneratedShader{QShader::Source::SpirvShader,QShaderVersion(100)},
17+
QShaderBaker::GeneratedShader{ QShader::Source::SpirvShader,QShaderVersion(100)},
1218
QShaderBaker::GeneratedShader{QShader::Source::GlslShader,QShaderVersion(430)},
1319
QShaderBaker::GeneratedShader{QShader::Source::MslShader,QShaderVersion(12)},
1420
QShaderBaker::GeneratedShader{QShader::Source::HlslShader,QShaderVersion(60)},
15-
});
21+
});
1622

1723
baker.setSourceString(code, stage);
1824
QShader shader = baker.bake();
1925
if (!shader.isValid()) {
20-
qWarning(code);
26+
QStringList codelist = QString(code).split('\n');
27+
for (int i = 0; i < codelist.size(); i++) {
28+
qWarning() << i + 1 << codelist[i].toLocal8Bit().data();
29+
}
2130
qWarning(baker.errorMessage().toLocal8Bit());
2231
}
2332
return shader;
@@ -26,7 +35,7 @@ QShader newShaderFromCode(QShader::Stage stage, const char* code) {
2635
QShader createShaderFromFile(QShader::Stage stage, const char* filename) {
2736
QFile file(filename);
2837
if (file.open(QIODevice::ReadOnly))
29-
return newShaderFromCode(stage,file.readAll().constData());
38+
return createShaderFromCode(stage,file.readAll().constData());
3039
return QShader();
3140
}
3241

@@ -45,30 +54,63 @@ void RunQtShaderTool() {
4554
runShaderTool.setArguments({
4655
"--glsl","430",
4756
"--msl","12" ,
57+
"--hlsl","60",
4858
"-c", "color.frag",
4959
"-o","color.frag.qsb" });
50-
runShaderTool.start();
51-
runShaderTool.waitForFinished();
52-
qDebug() << runShaderTool.readAllStandardOutput().constData();
53-
54-
runShaderTool.setArguments({
55-
"--glsl","430",
56-
"--msl","12" ,
57-
"-c", "color.vert",
58-
"-o","color.vert.qsb" });
5960

6061
runShaderTool.start();
6162
runShaderTool.waitForFinished();
62-
6363
qDebug() << runShaderTool.readAllStandardOutput().constData();
6464
}
6565

6666
int main(int argc, char **argv)
6767
{
6868
QApplication app(argc, argv);
69-
QDir::setCurrent(RESOURCE_DIR);
69+
QDir::setCurrent(RESOURCE_DIR"/Shader");
70+
71+
QWidget main;
72+
73+
QGridLayout* layout = new QGridLayout(&main);
74+
75+
QPushButton* btCompile = new QPushButton("Compile");
76+
QTextEdit* editor = new QTextEdit;
77+
QTextBrowser* glslBrowser = new QTextBrowser;
78+
QTextBrowser* hlslBrowser = new QTextBrowser;
79+
QTextBrowser* mslBrowser = new QTextBrowser;
80+
81+
layout->addWidget(btCompile, 0, 0);
82+
layout->addWidget(editor, 1, 0);
83+
84+
layout->addWidget(new QLabel("GLSL"), 0, 1, Qt::AlignCenter);
85+
layout->addWidget(glslBrowser, 1, 1);
86+
87+
layout->addWidget(new QLabel("HLSL"), 0, 2, Qt::AlignCenter);
88+
layout->addWidget(hlslBrowser, 1, 2);
89+
90+
layout->addWidget(new QLabel("MSL"), 0, 3, Qt::AlignCenter);
91+
layout->addWidget(mslBrowser, 1, 3);
92+
93+
editor->setTabStopDistance(16);
94+
editor->setText(R"(#version 430
95+
layout(location = 0) in vec3 vColor;
96+
layout(location = 0) out vec4 outFragColor;
97+
layout(std140, binding = 0) uniform UniformBlock {
98+
float opacity;
99+
}UBO;
100+
void main()
101+
{
102+
outFragColor = vec4(vColor, UBO.opacity);
103+
})");
104+
105+
QObject::connect(btCompile, &QPushButton::clicked, [&]() {
106+
QShader shader = createShaderFromCode(QShader::FragmentStage, editor->toPlainText().toLocal8Bit());
107+
glslBrowser->setText(shader.shader(QShaderKey(QShader::GlslShader, QShaderVersion(430))).shader());
108+
hlslBrowser->setText(shader.shader(QShaderKey(QShader::HlslShader, QShaderVersion(60))).shader());
109+
mslBrowser->setText(shader.shader(QShaderKey(QShader::MslShader, QShaderVersion(12))).shader());
110+
});
70111

71-
RunQtShaderTool();
112+
main.setMinimumSize(1200,800);
113+
main.show();
72114

73115
return app.exec();
74116
}

0 commit comments

Comments
 (0)