mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-05-13 10:51:35 +00:00
glTFViewer: replace default texture with an untextured shader (#106)
This fixes the issue where the default texture wasn't uploading correctly (due to 3f47729, changes in row pitch validation) by just removing the broken texture entirely.
This commit is contained in:
parent
741e33c394
commit
3d1154786f
@ -87,9 +87,7 @@ std::map<std::string, nxt::Buffer> buffers;
|
||||
std::map<std::string, nxt::CommandBuffer> commandBuffers;
|
||||
std::map<uint32_t, std::string> slotSemantics = {{0, "POSITION"}, {1, "NORMAL"}, {2, "TEXCOORD_0"}};
|
||||
|
||||
nxt::Sampler defaultSampler;
|
||||
std::map<std::string, nxt::Sampler> samplers;
|
||||
nxt::TextureView defaultTexture;
|
||||
std::map<std::string, nxt::TextureView> textures;
|
||||
|
||||
tinygltf::Scene scene;
|
||||
@ -171,6 +169,16 @@ namespace {
|
||||
const auto& iMaterial = scene.materials.at(iMaterialID);
|
||||
const auto& iTechnique = scene.techniques.at(iMaterial.technique);
|
||||
|
||||
bool hasTexture = false;
|
||||
std::string iTextureID;
|
||||
{
|
||||
auto it = iMaterial.values.find("diffuse");
|
||||
if (it != iMaterial.values.end() && !it->second.string_value.empty()) {
|
||||
hasTexture = true;
|
||||
iTextureID = it->second.string_value;
|
||||
}
|
||||
}
|
||||
|
||||
auto oVSModule = utils::CreateShaderModule(device, nxt::ShaderStage::Vertex, R"(
|
||||
#version 450
|
||||
|
||||
@ -192,7 +200,7 @@ namespace {
|
||||
gl_Position = u_transform.modelViewProj * a_position;
|
||||
})");
|
||||
|
||||
auto oFSModule = utils::CreateShaderModule(device, nxt::ShaderStage::Fragment, R"(
|
||||
auto oFSSourceTextured = R"(
|
||||
#version 450
|
||||
|
||||
layout(set = 0, binding = 1) uniform sampler u_samp;
|
||||
@ -210,7 +218,24 @@ namespace {
|
||||
float diffamb = diffuse * 0.85 + 0.15;
|
||||
vec3 albedo = texture(sampler2D(u_tex, u_samp), v_texcoord).rgb;
|
||||
fragcolor = vec4(diffamb * albedo, 1);
|
||||
})");
|
||||
})";
|
||||
auto oFSSourceUntextured = R"(
|
||||
#version 450
|
||||
|
||||
layout(location = 0) in vec3 v_normal;
|
||||
layout(location = 1) in vec2 v_texcoord;
|
||||
|
||||
out vec4 fragcolor;
|
||||
|
||||
void main() {
|
||||
const vec3 lightdir = normalize(vec3(-1, -2, 3));
|
||||
vec3 normal = normalize(v_normal);
|
||||
float diffuse = abs(dot(lightdir, normal));
|
||||
float diffamb = diffuse * 0.85 + 0.15;
|
||||
fragcolor = vec4(vec3(diffamb), 1);
|
||||
})";
|
||||
|
||||
auto oFSModule = utils::CreateShaderModule(device, nxt::ShaderStage::Fragment, hasTexture ? oFSSourceTextured : oFSSourceUntextured);
|
||||
|
||||
nxt::InputStateBuilder builder = device.CreateInputStateBuilder();
|
||||
std::bitset<3> slotsSet;
|
||||
@ -248,11 +273,15 @@ namespace {
|
||||
}
|
||||
auto inputState = builder.GetResult();
|
||||
|
||||
auto bindGroupLayout = device.CreateBindGroupLayoutBuilder()
|
||||
auto bindGroupLayoutBuilder = device.CreateBindGroupLayoutBuilder()
|
||||
.SetBindingsType(nxt::ShaderStageBit::Vertex, nxt::BindingType::UniformBuffer, 0, 1)
|
||||
.SetBindingsType(nxt::ShaderStageBit::Fragment, nxt::BindingType::Sampler, 1, 1)
|
||||
.SetBindingsType(nxt::ShaderStageBit::Fragment, nxt::BindingType::SampledTexture, 2, 1)
|
||||
.GetResult();
|
||||
.Clone();
|
||||
if (hasTexture) {
|
||||
bindGroupLayoutBuilder
|
||||
.SetBindingsType(nxt::ShaderStageBit::Fragment, nxt::BindingType::Sampler, 1, 1)
|
||||
.SetBindingsType(nxt::ShaderStageBit::Fragment, nxt::BindingType::SampledTexture, 2, 1);
|
||||
}
|
||||
auto bindGroupLayout = bindGroupLayoutBuilder.GetResult();
|
||||
|
||||
auto depthStencilState = device.CreateDepthStencilStateBuilder()
|
||||
.SetDepthCompareFunction(nxt::CompareFunction::Less)
|
||||
@ -285,18 +314,11 @@ namespace {
|
||||
bindGroupBuilder.SetLayout(bindGroupLayout)
|
||||
.SetUsage(nxt::BindGroupUsage::Frozen)
|
||||
.SetBufferViews(0, 1, &uniformView);
|
||||
{
|
||||
auto it = iMaterial.values.find("diffuse");
|
||||
if (it != iMaterial.values.end() && !it->second.string_value.empty()) {
|
||||
const auto& iTextureID = it->second.string_value;
|
||||
const auto& textureView = textures[iTextureID];
|
||||
const auto& iSamplerID = scene.textures[iTextureID].sampler;
|
||||
bindGroupBuilder.SetSamplers(1, 1, &samplers[iSamplerID]);
|
||||
bindGroupBuilder.SetTextureViews(2, 1, &textureView);
|
||||
} else {
|
||||
bindGroupBuilder.SetSamplers(1, 1, &defaultSampler);
|
||||
bindGroupBuilder.SetTextureViews(2, 1, &defaultTexture);
|
||||
}
|
||||
if (hasTexture) {
|
||||
const auto& textureView = textures[iTextureID];
|
||||
const auto& iSamplerID = scene.textures[iTextureID].sampler;
|
||||
bindGroupBuilder.SetSamplers(1, 1, &samplers[iSamplerID]);
|
||||
bindGroupBuilder.SetTextureViews(2, 1, &textureView);
|
||||
}
|
||||
|
||||
MaterialInfo material = {
|
||||
@ -310,11 +332,6 @@ namespace {
|
||||
}
|
||||
|
||||
void initSamplers() {
|
||||
defaultSampler = device.CreateSamplerBuilder()
|
||||
.SetFilterMode(nxt::FilterMode::Nearest, nxt::FilterMode::Nearest, nxt::FilterMode::Nearest)
|
||||
// TODO: wrap modes
|
||||
.GetResult();
|
||||
|
||||
for (const auto& s : scene.samplers) {
|
||||
const auto& iSamplerID = s.first;
|
||||
const auto& iSampler = s.second;
|
||||
@ -369,28 +386,6 @@ namespace {
|
||||
}
|
||||
|
||||
void initTextures() {
|
||||
{
|
||||
auto oTexture = device.CreateTextureBuilder()
|
||||
.SetDimension(nxt::TextureDimension::e2D)
|
||||
.SetExtent(1, 1, 1)
|
||||
.SetFormat(nxt::TextureFormat::R8G8B8A8Unorm)
|
||||
.SetMipLevels(1)
|
||||
.SetAllowedUsage(nxt::TextureUsageBit::TransferDst | nxt::TextureUsageBit::Sampled)
|
||||
.GetResult();
|
||||
// TODO: release this texture
|
||||
|
||||
uint32_t white = 0xffffffff;
|
||||
nxt::Buffer staging = utils::CreateFrozenBufferFromData(device, &white, sizeof(white), nxt::BufferUsageBit::TransferSrc);
|
||||
auto cmdbuf = device.CreateCommandBufferBuilder()
|
||||
.TransitionTextureUsage(oTexture, nxt::TextureUsageBit::TransferDst)
|
||||
.CopyBufferToTexture(staging, 0, 0, oTexture, 0, 0, 0, 1, 1, 1, 0)
|
||||
.GetResult();
|
||||
queue.Submit(1, &cmdbuf);
|
||||
oTexture.FreezeUsage(nxt::TextureUsageBit::Sampled);
|
||||
|
||||
defaultTexture = oTexture.CreateTextureViewBuilder().GetResult();
|
||||
}
|
||||
|
||||
for (const auto& t : scene.textures) {
|
||||
const auto& iTextureID = t.first;
|
||||
const auto& iTexture = t.second;
|
||||
|
Loading…
x
Reference in New Issue
Block a user