Не могу сделать смешивание работы

У меня есть трехмерный набор данных, где каждое значение набора данных нормализовано [0, 1], Я хочу визуализировать этот набор данных, используя текстуру и смешивание.
Однако, похоже, я не могу заставить это работать.

Вот что я сделал до сих пор:

int main(){
...
//building an image for each rectangular slice of data
vector<Texture> myTextures;
for (GLint rowIndex = 0; rowIndex < ROW_NUM; rowIndex++)
{
auto pathToImage = "images/row" + to_string(rowIndex) + FILE_EXT;
FIBITMAP *img = FreeImage_Allocate(SLICE_DIMENSION, SLICE_NUM, 32); //32 = RGBA

for (GLint depthIndex = 0; depthIndex < DEPTH_NUM; depthIndex++)
{
for (GLint colIndex = 0; colIndex < COL_NUM; colIndex++)
{
auto value = my3DData[depthIndex][rowIndex][colIndex];

//transform tValue to a source color
glm::vec4 source = transformValueToColor(value);

//note that here I am also setting the opacity.
RGBQUAD linRgb = { source.b, source.g, source.r, source.a };
FreeImage_SetPixelColor(img, colIndex, depthIndex, &linRgb);
}
}

//Saving images. Saved images shows transparency.
FreeImage_Save(FIF_PNG, img, pathToImage.c_str());
myTextures.push_back(Texture(pathToImage.c_str(), GL_TEXTURE0));
}
//create VAO, VBO, EBO for a unit quad.

glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

//game loop
while (!glfwWindowShouldClose(window))
{
...
for (int i = 0; i < myTextures.size(); i++)
{
GLint index = myTextures.size() - i - 1;
myTextures[index].bind(); //does glActiveTexture(...), and glBindTexture(...);

glm::mat4 model;

//translate
model = glm::translate(model, glm::vec3(0.0f, 0.0f, -index*0.003f));

//scale
model = glm::scale(model, glm::vec3(1.2f));

glUniformMatrix4fv(glGetUniformLocation(ourShader.Program, "model"), 1, GL_FALSE, glm::value_ptr(model));

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
}
}

transformValueToColorдля преобразования значения данных в [0,1] цветовой стоимости:

//All inputs >=0.6 is transformed to highly transparent white color.
glm::vec4 transformValueToColor(GLclampf tValue)
{
if (tValue >= 0.6f) {
return glm::vec4(255, 255, 255, 10);
}
else {
auto val = round(255 * tValue);
auto valOp = round(255 * (1 - tValue));
return glm::vec4(val, val, val, valOp);
}
}

Мой вершинный шейдер:

#version 330 core

layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;

out vec2 TexCoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
gl_Position = projection * view * model * vec4(position, 1.0f);
TexCoord = vec2(texCoord.s, 1-texCoord.t);
}

Мой фрагмент шейдера:

#version 330 core

in vec2 TexCoord;

out vec4 color;

uniform sampler2D sliceTexture;

void main()
{
vec4 texColor = texture(sliceTexture, TexCoord);
color = texColor;
}

Я думаю, что это код, необходимый для смешивания для работы. Изображения генерируются правильно, а также корректно применяются в качестве текстуры на четырехугольниках. Однако квадраты на передней панели выглядят полностью непрозрачными, хотя сгенерированные изображения (даже те, что появляются спереди) показывают прозрачную область.

Я не уверен, где я иду не так. Запрашивая ваши предложения.

Спасибо.

Редактировать: детали Texture класс (только части, относящиеся к загрузке RGBA образ и создание RGBA текстура от того)

int width, height, channelCount;
unsigned char* image = SOIL_load_image(pathToImage, &width, &height, &channelCount, SOIL_LOAD_RGBA);
...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);

Edit2: Добавлена ​​информация о классе камеры. Camera::getViewMatrix() обеспечивает view матрица.

Camera::Camera(GLFWwindow* window, glm::vec3 position, glm::vec3 worldUpDirection, GLfloat yaw, GLfloat pitch)
:mouseSensitivity(0.25f), fov(45.0f), cameraSpeed(1.0f)
{
this->position = this->originalPosition = position;
this->worldUpDirection = worldUpDirection;
this->yaw = this->originalYaw = yaw;
this->pitch = this->originalPitch = pitch;

updateCameraVectors();
}

void Camera::updateCameraVectors()
{
glm::mat4 yawPitchRotMat;

yawPitchRotMat = glm::rotate(yawPitchRotMat, glm::radians(yaw), glm::vec3(0.0f, 1.0f, 0.0f));       //y-ais as yaw axis
yawPitchRotMat = glm::rotate(yawPitchRotMat, glm::radians(pitch), glm::vec3(1.0f, 0.0f, 0.0f));     //x-axis as pitch axis

frontDirection = glm::normalize(-glm::vec3(yawPitchRotMat[2].x, yawPitchRotMat[2].y, yawPitchRotMat[2].z));

rightDirection = glm::normalize(glm::cross(frontDirection, worldUpDirection));
upDirection = glm::normalize(glm::cross(rightDirection, frontDirection));
}

glm::mat4 Camera::getViewMatrix()
{
return glm::lookAt(position, position + frontDirection, upDirection);
}

0

Решение

myTextures.push_back(Texture(pathToImage.c_str(), GL_TEXTURE0));

Это не включает в себя информацию о вашем Texture класс и как он разбирает файлы изображений. Даже если сами файлы показывают прозрачность, возможно, ваш код загрузки текстуры отбрасывает альфа-канал при загрузке изображения.

model = glm::translate(model, glm::vec3(0.0f, 0.0f, -index*0.003f));

Это выглядит так, как будто вы делаете рендеринг спереди назад. Если вы хотите визуализировать прозрачные объекты, вам нужно использовать алгоритм прозрачности, независимой от порядка, или визуализировать задом наперед.

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Вы также можете / нужно использовать glBlendFuncSeparate так что микширование альфа-канала выполняется по-другому. Я не уверен в этом, хотя.

Вы также можете рассмотреть возможность простого заполнения одного объекта GL_TEXTURE_3D и рендеринга его в виде куба, выполняя все микширование в фрагментном шейдере, а не визуализируя серию квадов для каждого слоя.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector