Стеклянный материал в программе Qt3D C++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Стеклянный материал в программе Qt3D C++?

Сообщение Anonymous »

Я пишу программу моделирования на 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»