Рендеринг файлов .obj с помощью OpenGlC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Рендеринг файлов .obj с помощью OpenGl

Сообщение Anonymous »

Я хочу загрузить файлы .obj с помощью C++ и нарисовать их формы и материалы на сцене с помощью OpenGl. Для загрузки я использую tinyobjectloader от syoyo. Загрузка работает очень хорошо, и я могу нарисовать объект со статическим цветом или статической диффузной текстурой.
Таким образом, я могу передать все версии и координаты текстуры в шейдер, используя буферы.
Мой Теперь проблема заключается в том, как установить правильный цвет в пиксельном шейдере.
Формы, заданные классом загрузчика, имеют сетку и материал, которые определяются следующим образом:

Код: Выделить всё

typedef struct {
std::string name;

float ambient[3];
float diffuse[3];
float specular[3];
float transmittance[3];
float emission[3];
float shininess;
float ior;                // index of refraction
float dissolve;           // 1 == opaque; 0 == fully transparent
// illumination model (see http://www.fileformat.info/format/material/)
int illum;

std::string ambient_texname;
std::string diffuse_texname;
std::string specular_texname;
std::string normal_texname;
std::map unknown_parameter;
} material_t;

typedef struct
{
std::vector          positions;
std::vector          normals;
std::vector          texcoords;
std::vector   indices;
} mesh_t;
Я хотел бы установить все цвета и различные текстуры в качестве униформы.
Например, диффузный цвет будет установлен следующим образом:

Код: Выделить всё

GLuint diffColLocation = glGetUniformLocation(programmId, "diffuseColor");
glUniform3f(diffColLocation, this->material.diffuse[0], this->material.diffuse[1], this->material.diffuse[2]);
А текстуры такие:

Код: Выделить всё

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, this->ambientTextureID);
glUniform1i(this->diffuseTextureUniformIndex, 0);

glActiveTexture(GL_TEXTURE0 + 1);
glBindTexture(GL_TEXTURE_2D, this->diffuseTextureID);
glUniform1i(this->diffuseTextureUniformIndex, 0);
etc.
Мне также удалось загрузить объект, все формы которого имели диффузную текстуру. Так что здесь нет проблем. Моя проблема в том, как бороться с неустановленными текстурами. Например, многие объекты не имеют набора зеркальных текстур. Могу ли я как-нибудь создать текстуру по умолчанию?

Мой пиксельный шейдер сейчас выглядит так:

Код: Выделить всё

#version 150 core
#extension GL_ARB_explicit_attrib_location: enable

// output to the (default) FBO in color buffer 0
layout (location = 0) out vec4 outColor;

in vec2 fragTextCoords;

uniform sampler2D ambientTex;
uniform sampler2D diffuseTex;
uniform sampler2D specularTex;

uniform vec3 ambientColor;
uniform vec3 diffuseColor;
uniform vec3 specularColor;

// main entry point for the fragment shader
void main() {
//vec3 tempColor ambientColor + diffuseTex * specularTex;     //Is that correct?
//outcolor = tempColor * texture(diffuseTex, fragTextCoords); //Then this?
outcolor = texture(diffuseTex, fragTextCoords);
}
Таким образом, отображается только текстура, и это работает только в том случае, если каждая фигура имеет диффузную текстуру. Но как мне объединить все цвета и текстуры так, чтобы объект выглядел так же, как в моей 3D-программе? Что произойдет, если один из цветов имеет значение null или когда sampler2D имеет значение null?

Подробнее здесь: https://stackoverflow.com/questions/237 ... ith-opengl
Ответить

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

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

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

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

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