Skip to content

Commit

Permalink
[feature] 增加若干示例,迭代版本到Qt6.6.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Italink committed Apr 9, 2023
1 parent 9d124c4 commit 79d7465
Show file tree
Hide file tree
Showing 166 changed files with 29,107 additions and 1,002 deletions.
2 changes: 1 addition & 1 deletion Docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ comments: true
- 图形技术
- [ ] 样条线
- [ ] 文字渲染
- [x] 天空盒
- [x] 静态网格体
- [x] 骨骼网格体及骨骼动画
- [x] 天空盒
- [x] GPU粒子
- [ ] Shader Toy
- [ ] 后期滤镜
Expand Down
2 changes: 1 addition & 1 deletion Source/0-QEngineUtilities

This file was deleted.

119 changes: 118 additions & 1 deletion Source/1-GraphicsAPI/02-GraphicRenderingPipeline/Source/main.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,122 @@
#include <QApplication>
#include "TriangleWindow.h"
#include "Render/RHI/QRhiWindow.h"

static float VertexData[] = {
//position(xy) color(rgba)
0.0f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f,
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f,
};

class TriangleWindow : public QRhiWindow {
private:
QRhiEx::Signal sigInit;
QRhiEx::Signal sigSubmit;
QScopedPointer<QRhiBuffer> mVertexBuffer;
QScopedPointer<QRhiShaderResourceBindings> mShaderBindings;
QScopedPointer<QRhiGraphicsPipeline> mPipeline;
public:
TriangleWindow(QRhiWindow::InitParams inInitParams) :QRhiWindow(inInitParams) {
sigInit.request();
sigSubmit.request();
}
protected:
void initRhiResource() {
mVertexBuffer.reset(mRhi->newBuffer(QRhiBuffer::Immutable, QRhiBuffer::VertexBuffer, sizeof(VertexData)));
mVertexBuffer->create();

mShaderBindings.reset(mRhi->newShaderResourceBindings()); //创建绑定
mShaderBindings->create();

mPipeline.reset(mRhi->newGraphicsPipeline());

mPipeline->setShaderResourceBindings(mShaderBindings.get()); //绑定到流水线中华

QRhiGraphicsPipeline::TargetBlend targetBlend;
targetBlend.enable = false;
mPipeline->setTargetBlends({ QRhiGraphicsPipeline::TargetBlend() });

mPipeline->setSampleCount(mSwapChain->sampleCount());

mPipeline->setDepthTest(false);
mPipeline->setDepthOp(QRhiGraphicsPipeline::Always);
mPipeline->setDepthWrite(false);


QRhiVertexInputLayout inputLayout;
inputLayout.setBindings({
QRhiVertexInputBinding(6 * sizeof(float)) //定义每个VertexBuffer,单组顶点数据的跨度,这里是 6 * sizeof(float),可以当作是GPU会从Buffer0(0是Index)读取 6 * sizeof(float) 传给 Vertex Shader
});

inputLayout.setAttributes({
QRhiVertexInputAttribute(0, 0 , QRhiVertexInputAttribute::Float2, 0), // 从每组顶点数据的位置 0 开始作为 Location0(Float2) 的起始地址
QRhiVertexInputAttribute(0, 1 , QRhiVertexInputAttribute::Float4, sizeof(float) * 2), // 从每组顶点数据的位置 sizeof(float) * 2 开始作为 Location1(Float4) 的起始地址
});

mPipeline->setVertexInputLayout(inputLayout);

QShader vs = mRhi->newShaderFromCode(QShader::VertexStage, R"(#version 440
layout(location = 0) in vec2 position; //这里需要与上面的inputLayout 对应
layout(location = 1) in vec4 color;
layout (location = 0) out vec4 vColor; //输出变量到 fragment shader 中,这里的location是out的,而不是in
out gl_PerVertex {
vec4 gl_Position;
};
void main(){
gl_Position = vec4(position,0.0f,1.0f);
vColor = color;
}
)");
Q_ASSERT(vs.isValid());

QShader fs = mRhi->newShaderFromCode(QShader::FragmentStage, R"(#version 440
layout (location = 0) in vec4 vColor; //上一阶段的out变成了这一阶段的in
layout (location = 0) out vec4 fragColor;
void main(){
fragColor = vColor;
}
)");
Q_ASSERT(fs.isValid());

mPipeline->setShaderStages({
QRhiShaderStage(QRhiShaderStage::Vertex, vs),
QRhiShaderStage(QRhiShaderStage::Fragment, fs)
});
mPipeline->setRenderPassDescriptor(mSwapChainPassDesc.get());
mPipeline->create();
}

virtual void onRenderTick() override {
QRhiRenderTarget* currentRenderTarget = mSwapChain->currentFrameRenderTarget();
QRhiCommandBuffer* currentCmdBuffer = mSwapChain->currentFrameCommandBuffer();

if (sigInit.receive()) {
initRhiResource();
}
QRhiResourceUpdateBatch* resourceUpdates = nullptr;
if (sigSubmit.receive()) {
resourceUpdates = mRhi->nextResourceUpdateBatch();
resourceUpdates->uploadStaticBuffer(mVertexBuffer.get(), VertexData); //上传顶点数据
}

const QColor clearColor = QColor::fromRgbF(0.2f, 0.2f, 0.2f, 1.0f);
const QRhiDepthStencilClearValue dsClearValue = { 1.0f,0 };

currentCmdBuffer->beginPass(currentRenderTarget, clearColor, dsClearValue, resourceUpdates);

currentCmdBuffer->setGraphicsPipeline(mPipeline.get());
currentCmdBuffer->setViewport(QRhiViewport(0, 0, mSwapChain->currentPixelSize().width(), mSwapChain->currentPixelSize().height()));
currentCmdBuffer->setShaderResources();
const QRhiCommandBuffer::VertexInput vertexBindings(mVertexBuffer.get(), 0); //将 mVertexBuffer 绑定到Buffer0,内存偏移值为0
currentCmdBuffer->setVertexInput(0, 1, &vertexBindings);
currentCmdBuffer->draw(3);

currentCmdBuffer->endPass();
}
};

int main(int argc, char **argv)
{
Expand Down
76 changes: 59 additions & 17 deletions Source/1-GraphicsAPI/03-Shader/Source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,30 @@
#include <QFile>
#include <QDir>
#include "private/qshaderbaker_p.h"
#include "QWidget"
#include "QTextEdit"
#include "QTextBrowser"
#include "QBoxLayout"
#include "QPushButton"
#include "QLabel"

QShader newShaderFromCode(QShader::Stage stage, const char* code) {
QShader createShaderFromCode(QShader::Stage stage, const char* code) {
QShaderBaker baker;
baker.setGeneratedShaderVariants({ QShader::StandardShader });
baker.setGeneratedShaders({
QShaderBaker::GeneratedShader{QShader::Source::SpirvShader,QShaderVersion(100)},
QShaderBaker::GeneratedShader{ QShader::Source::SpirvShader,QShaderVersion(100)},
QShaderBaker::GeneratedShader{QShader::Source::GlslShader,QShaderVersion(430)},
QShaderBaker::GeneratedShader{QShader::Source::MslShader,QShaderVersion(12)},
QShaderBaker::GeneratedShader{QShader::Source::HlslShader,QShaderVersion(60)},
});
});

baker.setSourceString(code, stage);
QShader shader = baker.bake();
if (!shader.isValid()) {
qWarning(code);
QStringList codelist = QString(code).split('\n');
for (int i = 0; i < codelist.size(); i++) {
qWarning() << i + 1 << codelist[i].toLocal8Bit().data();
}
qWarning(baker.errorMessage().toLocal8Bit());
}
return shader;
Expand All @@ -26,7 +35,7 @@ QShader newShaderFromCode(QShader::Stage stage, const char* code) {
QShader createShaderFromFile(QShader::Stage stage, const char* filename) {
QFile file(filename);
if (file.open(QIODevice::ReadOnly))
return newShaderFromCode(stage,file.readAll().constData());
return createShaderFromCode(stage,file.readAll().constData());
return QShader();
}

Expand All @@ -45,30 +54,63 @@ void RunQtShaderTool() {
runShaderTool.setArguments({
"--glsl","430",
"--msl","12" ,
"--hlsl","60",
"-c", "color.frag",
"-o","color.frag.qsb" });
runShaderTool.start();
runShaderTool.waitForFinished();
qDebug() << runShaderTool.readAllStandardOutput().constData();

runShaderTool.setArguments({
"--glsl","430",
"--msl","12" ,
"-c", "color.vert",
"-o","color.vert.qsb" });

runShaderTool.start();
runShaderTool.waitForFinished();

qDebug() << runShaderTool.readAllStandardOutput().constData();
}

int main(int argc, char **argv)
{
QApplication app(argc, argv);
QDir::setCurrent(RESOURCE_DIR);
QDir::setCurrent(RESOURCE_DIR"/Shader");

QWidget main;

QGridLayout* layout = new QGridLayout(&main);

QPushButton* btCompile = new QPushButton("Compile");
QTextEdit* editor = new QTextEdit;
QTextBrowser* glslBrowser = new QTextBrowser;
QTextBrowser* hlslBrowser = new QTextBrowser;
QTextBrowser* mslBrowser = new QTextBrowser;

layout->addWidget(btCompile, 0, 0);
layout->addWidget(editor, 1, 0);

layout->addWidget(new QLabel("GLSL"), 0, 1, Qt::AlignCenter);
layout->addWidget(glslBrowser, 1, 1);

layout->addWidget(new QLabel("HLSL"), 0, 2, Qt::AlignCenter);
layout->addWidget(hlslBrowser, 1, 2);

layout->addWidget(new QLabel("MSL"), 0, 3, Qt::AlignCenter);
layout->addWidget(mslBrowser, 1, 3);

editor->setTabStopDistance(16);
editor->setText(R"(#version 430
layout(location = 0) in vec3 vColor;
layout(location = 0) out vec4 outFragColor;
layout(std140, binding = 0) uniform UniformBlock {
float opacity;
}UBO;
void main()
{
outFragColor = vec4(vColor, UBO.opacity);
})");

QObject::connect(btCompile, &QPushButton::clicked, [&]() {
QShader shader = createShaderFromCode(QShader::FragmentStage, editor->toPlainText().toLocal8Bit());
glslBrowser->setText(shader.shader(QShaderKey(QShader::GlslShader, QShaderVersion(430))).shader());
hlslBrowser->setText(shader.shader(QShaderKey(QShader::HlslShader, QShaderVersion(60))).shader());
mslBrowser->setText(shader.shader(QShaderKey(QShader::MslShader, QShaderVersion(12))).shader());
});

RunQtShaderTool();
main.setMinimumSize(1200,800);
main.show();

return app.exec();
}
Loading

0 comments on commit 79d7465

Please sign in to comment.