Sascha Willems glftLoader app

Started by
0 comments, last by taby 1 year, 1 month ago

I'm trying to pass in multiple textures to a shader. I'm not having much luck. I'm also a beginner at this.

I'm using the Sascha Willems glftLoading demo, and the code I'm using is this:


for (VulkanglTFModel::Primitive& primitive : node->mesh.primitives)
{
	if (primitive.indexCount > 0) 
	{
		// Get the texture index for this primitive
		VulkanglTFModel::Texture texture = textures[materials[primitive.materialIndex].baseColorTextureIndex];
		VulkanglTFModel::Texture texture2 = textures[materials[primitive.materialIndex].normalTextureIndex];
		// Bind the descriptor for the current primitive's texture
		vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 1, 1, &images[texture.imageIndex].descriptorSet, 0, nullptr);
		vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 1, 1, &images[texture2.imageIndex].descriptorSet, 0, nullptr);
		vkCmdDrawIndexed(commandBuffer, primitive.indexCount, 1, primitive.firstIndex, 0, 0);
	}
}

Where…

	void loadMaterials(tinygltf::Model& input)
	{
		materials.resize(input.materials.size());
		for (size_t i = 0; i < input.materials.size(); i++) {
			// We only read the most basic properties required for our sample
			tinygltf::Material glTFMaterial = input.materials[i];
			// Get the base color factor
			if (glTFMaterial.values.find("baseColorFactor") != glTFMaterial.values.end()) {
				materials[i].baseColorFactor = glm::make_vec4(glTFMaterial.values["baseColorFactor"].ColorFactor().data());
			}
			// Get base color texture index
			if (glTFMaterial.values.find("baseColorTexture") != glTFMaterial.values.end()) {

				std::cout << "found base color texture" << std::endl;

				materials[i].baseColorTextureIndex = glTFMaterial.values["baseColorTexture"].TextureIndex();
			}

			if (glTFMaterial.values.find("normalTexture") != glTFMaterial.values.end()) {
				std::cout << "found normal texture" << std::endl;

				materials[i].normalTextureIndex = glTFMaterial.values["normalTexture"].TextureIndex();
			}

		}
	}

and

	struct Material {
		glm::vec4 baseColorFactor = glm::vec4(1.0f);
		uint32_t baseColorTextureIndex;
		uint32_t normalTextureIndex;
	};

the fragment shader is:

#version 450

layout (set = 1, binding = 0) uniform sampler2D samplerColorMap;
layout (set = 1, binding = 1) uniform sampler2D textureMap;

layout (location = 0) in vec3 inNormal;
layout (location = 1) in vec3 inColor;
layout (location = 2) in vec2 inUV;
layout (location = 3) in vec3 inViewVec;
layout (location = 4) in vec3 inLightVec;

layout (location = 0) out vec4 outFragColor;

void main() 
{
	vec4 color = texture(textureMap, inUV) * vec4(inColor, 1.0);

	vec3 N = normalize(inNormal);
	vec3 L = normalize(inLightVec);
	vec3 V = normalize(inViewVec);
	vec3 R = reflect(L, N);
	vec3 diffuse = max(dot(N, L), 0.15) * inColor;
	vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.75);
	outFragColor = vec4(diffuse * color.rgb + specular, 1.0);		
}

As soon as I do the UV lookup fro the textureMap, the app locks and crashes. Any help is great. Thanks.

This topic is closed to new replies.

Advertisement