Я пишу программу моделирования на C++, которая визуализирует трехмерную сцену в объекте QML Scene3D из C++. Это работает хорошо, но я хотел бы добавить к сцене почти прозрачные конусные сетки.
Я пробовал использовать Qt3DExtras::QDiffuseSpecularMaterial с низкими значениями альфа, но результат не тот. достаточно прозрачный. Фактически, использование нулевого альфа-значения приводит к созданию сплошных белых объектов.
Qt3DExtras::QConeMesh *m_cone = new Qt3DExtras::QConeMesh(e);
Qt3DExtras::QDiffuseSpecularMaterial *conemat = new Qt3DExtras::QDiffuseSpecularMaterial(e);
QColor coneColor = QColor::fromRgbF(0,0.5,0,0);
conemat->setDiffuse(coneColor);
conemat->setAlphaBlendingEnabled(true);
m_cone->setBottomRadius(1798444);
m_cone->setTopRadius(0);
m_cone->setLength(sat->orbitRadius()-EARTH_RADIUS);
Какой класс материала и параметры материала C++ можно использовать для рисования очень слабых прозрачных объектов?
В QML это кажется простым с использованием фрагментов шейдера. Как это можно сделать на C++?
CustomMaterial {
shadingMode: CustomMaterial.Shaded
fragmentShader: "material_transparent.frag"
}
Transparent.frag
void MAIN()
{
vec2 size = vec2(textureSize(SCREEN_TEXTURE, 0));
vec2 uv = FRAGCOORD.xy / size;
vec3 view = normalize(VIEW_VECTOR);
vec3 projection = view - view * normalize(NORMAL);
vec3 refraction = projection * projection;
uv += refraction.xy * 0.5;
vec3 col = texture(SCREEN_TEXTURE, uv).rgb;
col = col * 0.8 + vec3(0.2);
BASE_COLOR = vec4(col, 1.0);
}
РЕДАКТИРОВАТЬ: Карлфилип предложил мне использовать QEffect. Я попробовал что-то на основе документации Qt (я не смог найти ни одного примера). Это то, что я пробовал, но статус glShader в конце всегда всегда «Неготов». Должно быть, я что-то упускаю. Есть идеи?
Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
// Create technique, render pass and shader
Qt3DRender::QTechnique *gl3Technique = new Qt3DRender::QTechnique();
Qt3DRender::QRenderPass *gl3Pass = new Qt3DRender::QRenderPass();
Qt3DRender::QShaderProgram *glShader = new Qt3DRender::QShaderProgram();
// Set the shader on the render pass
gl3Pass->setShaderProgram(glShader);
// 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(1);
gl3Technique->graphicsApiFilter()->setProfile(Qt3DRender::QGraphicsApiFilter::CoreProfile);
// Add the technique to the effect
effect->addTechnique(gl3Technique);
QByteArray prog = glShader->loadSource(QUrl("qrc:/material_transparent.frag"));
glShader->setFragmentShaderCode(prog);
Подробнее здесь: https://stackoverflow.com/questions/789 ... -c-program
Стеклянный материал в программе Qt3D C++? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение