[英]Qt3d/C++ - How to use frameGraphe to achive Outlines?
我制作了一個簡單的查看器,允許您導入.obj文件,我想要實現的是,當用戶選擇模型時,着色器將以不同的顏色繪制模型輪廓。
我用來表示.obj文件的是帶有自定義QMaterial,自定義QPickerObject和QMesh的QEntity。
使用我的自定義QMaterial,我制作了簡單的平面着色 (基於面部法線進行着色)
// My Custom QMaterial :
explicit CustomizedMaterial(Qt3DCore::QNode *parent = nullptr) : QMaterial(parent)
{
// Create effect, technique, render pass and shader
Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
Qt3DRender::QTechnique *gl3Technique = new Qt3DRender::QTechnique();
Qt3DRender::QRenderPass *gl3Pass = new Qt3DRender::QRenderPass();
Qt3DRender::QShaderProgram *glShader = new Qt3DRender::QShaderProgram();
QByteArray ver(
"#version 330\n"
"out vec3 vViewPos;\n"
"in vec3 vertexPosition;\n"
"in vec3 vertexNormal;\n"
"uniform mat4 modelView;\n"
"uniform mat3 modelViewNormal;\n"
"uniform mat4 mvp;\n"
"void main()\n"
"{\n"
"vec4 pos = vec4(vertexPosition, 1.0);\n"
"vec4 mpos = modelView * pos;\n"
"gl_Position = mvp * vec4(vertexPosition, 1.0);\n"
"vViewPos = -mpos.xyz;\n"
"}\n");
QByteArray frag(
"#version 330\n"
"vec3 normals(vec3 pos)\n"
"{\n"
"vec3 fdx = dFdx(pos);\n"
"vec3 fdy = dFdy(pos);\n"
"return normalize(cross(fdx, fdy));\n"
"}\n"
"in vec3 vViewPos;\n"
"out vec4 fragColor;\n"
"void main()\n"
"{\n"
"vec3 normal = normals(vViewPos);\n"
"vec3 gray = vec3(0.9, 0.9, 0.9);\n"
"float theta = dot(normal, vec3(0, 0, 1)) / length(normal);\n"
"fragColor = vec4(gray * theta , 1.0);\n"
"}\n");
glShader->setVertexShaderCode(ver);
glShader->setFragmentShaderCode(frag);
// Set the shader on the render pass
gl3Pass->setShaderProgram(glShader);
// filter
Qt3DRender::QFilterKey *m_filterKey = new Qt3DRender::QFilterKey(this);
m_filterKey->setName(QStringLiteral("renderingStyle"));
m_filterKey->setValue(QStringLiteral("forward"));
// Add the pass to the technique
gl3Technique->addRenderPass(gl3Pass);
// Set the targeted GL version for the technique
gl3Technique->graphicsApiFilter()->setApi(Qt3DRender::QGraphicsApiFilter::OpenGL);
gl3Technique->graphicsApiFilter()->setMajorVersion(3);
gl3Technique->graphicsApiFilter()->setMinorVersion(2);
gl3Technique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
// Add filter
gl3Technique->addFilterKey(m_filterKey);
// Add the technique to the effect
effect->addTechnique(gl3Technique);
// Set the effect on the materials
setEffect(effect);
}
從我的搜索中,我認為最簡單的方法是使用兩次渲染過程技術,可惜Qt3d / C ++中沒有文檔或示例向我展示如何做,有什么可以幫助的嗎?
提前致謝。
是的,不幸的是,在這方面沒有太多的信息。 看起來Qt在QML上投入了更多的精力和資源,而不是C ++ /所有示例都以5比1支持QML /。 好吧,我設法使自定義着色器工作。 我玩過您的代碼,僅更改了一些:
創建后,我立即移動了QTechnique的配置,並且更改了該技術的初始化順序:
gl3Technique-> graphicsApiFilter()-> setProfile(Qt3DRender :: QGraphicsApiFilter :: CoreProfile);
gl3Technique-> graphicsApiFilter()-> setApi(Qt3DRender :: QGraphicsApiFilter :: OpenGL);
gl3Technique-> graphicsApiFilter()-> setMajorVersion(3);
gl3Technique-> graphicsApiFilter()-> setMinorVersion(1);
我把QFilterKey作為技術
Qt3DRender :: QFilterKey * filterkey =新的Qt3DRender :: QFilterKey(this);
filterkey-> setName(QStringLiteral(“ renderingStyle”));;
filterkey-> setValue(QStringLiteral(“ forward”));
我以與示例QML代碼所示相同的方式從資源加載着色器:
glShader-> setVertexShaderCode(Qt3DRender :: QShaderProgram :: loadSource(QUrl(QStringLiteral(“ qrc:/MyShader/simpleColor.vert”)))));;
glShader-> setFragmentShaderCode(Qt3DRender :: QShaderProgram :: loadSource(QUrl(QStringLiteral(“ qrc:/MyShader/simpleColor.frag”)))));
我沒有調查其中哪個是主要原因,但仍在工作。
之后,我在這篇文章中找到了另一條確認信息-同樣的處理方式
如何使3D對象上的區域顏色與@AdaRaider和@ user3405291不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.