gltf emission texture
This commit is contained in:
parent
6edd4b8e79
commit
e410168923
1
gltf.js
1
gltf.js
@ -27,7 +27,6 @@ function transformMatrix()
|
|||||||
|
|
||||||
function buildTransfomMatrices(json)
|
function buildTransfomMatrices(json)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseGltfChunks(buffer)
|
function parseGltfChunks(buffer)
|
||||||
|
|||||||
11
gltf.wgsl
11
gltf.wgsl
@ -8,7 +8,9 @@ struct Configuration {
|
|||||||
@group(0) @binding(0) var<uniform> config: Configuration;
|
@group(0) @binding(0) var<uniform> config: Configuration;
|
||||||
@group(0) @binding(1) var<storage> nodeMatrix: array<mat4x4f>;
|
@group(0) @binding(1) var<storage> nodeMatrix: array<mat4x4f>;
|
||||||
@group(0) @binding(2) var linearSampler: sampler;
|
@group(0) @binding(2) var linearSampler: sampler;
|
||||||
@group(0) @binding(3) var colorTexture: texture_2d<f32>;
|
|
||||||
|
@group(1) @binding(0) var baseTexture: texture_2d<f32>;
|
||||||
|
@group(1) @binding(1) var emissionTexture: texture_2d<f32>;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
struct Imm {
|
struct Imm {
|
||||||
@ -79,7 +81,7 @@ fn lighting(position: vec3f, lightPosition: vec3f, eyePosition: vec3f, normal: v
|
|||||||
{
|
{
|
||||||
let lightVector = normalize(lightPosition - position);
|
let lightVector = normalize(lightPosition - position);
|
||||||
let ndotl = max(dot(lightVector, normal), 0.0);
|
let ndotl = max(dot(lightVector, normal), 0.0);
|
||||||
let intensity = (ndotl + 0.3) / 1.3;
|
let intensity = (ndotl + 0.2) / 1.2;
|
||||||
|
|
||||||
let toEye = normalize(eyePosition - position);
|
let toEye = normalize(eyePosition - position);
|
||||||
|
|
||||||
@ -90,7 +92,8 @@ fn lighting(position: vec3f, lightPosition: vec3f, eyePosition: vec3f, normal: v
|
|||||||
fn fragmentMain(input: VertexOutput) -> @location(0) vec4f
|
fn fragmentMain(input: VertexOutput) -> @location(0) vec4f
|
||||||
{
|
{
|
||||||
let intensity = lighting(input.positionWorld, input.lightPosition, input.eyePosition, normalize(input.normal));
|
let intensity = lighting(input.positionWorld, input.lightPosition, input.eyePosition, normalize(input.normal));
|
||||||
let color = textureSample(colorTexture, linearSampler, input.texture);
|
let base = textureSample(baseTexture, linearSampler, input.texture);
|
||||||
|
let emission = textureSample(emissionTexture, linearSampler, input.texture);
|
||||||
|
|
||||||
return vec4(color.xyz * intensity, 1.0);
|
return vec4(base.xyz * intensity + emission.xyz, 1.0);
|
||||||
}
|
}
|
||||||
|
|||||||
45
index2.js
45
index2.js
@ -36,7 +36,7 @@ function printMatrix(m, o)
|
|||||||
}
|
}
|
||||||
|
|
||||||
class GltfRenderer {
|
class GltfRenderer {
|
||||||
constructor(device, canvasFormat, viewUniformBuffer, shaderModule, gltf, texture)
|
constructor(device, canvasFormat, viewUniformBuffer, shaderModule, gltf, textures)
|
||||||
{
|
{
|
||||||
this.gltf = gltf;
|
this.gltf = gltf;
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ class GltfRenderer {
|
|||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
this.sampler = device.createSampler();
|
this.sampler = device.createSampler();
|
||||||
this.texture = texture;
|
this.textures = textures;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
// buffer
|
// buffer
|
||||||
@ -85,8 +85,16 @@ class GltfRenderer {
|
|||||||
binding: 2,
|
binding: 2,
|
||||||
visibility: GPUShaderStage.FRAGMENT,
|
visibility: GPUShaderStage.FRAGMENT,
|
||||||
sampler: {}
|
sampler: {}
|
||||||
|
}]
|
||||||
|
}),
|
||||||
|
device.createBindGroupLayout({
|
||||||
|
label: "gltf bind group layout 1",
|
||||||
|
entries: [{
|
||||||
|
binding: 0,
|
||||||
|
visibility: GPUShaderStage.FRAGMENT,
|
||||||
|
texture: {},
|
||||||
}, {
|
}, {
|
||||||
binding: 3,
|
binding: 1,
|
||||||
visibility: GPUShaderStage.FRAGMENT,
|
visibility: GPUShaderStage.FRAGMENT,
|
||||||
texture: {},
|
texture: {},
|
||||||
}]
|
}]
|
||||||
@ -161,7 +169,7 @@ class GltfRenderer {
|
|||||||
|
|
||||||
this.bindGroups = [
|
this.bindGroups = [
|
||||||
device.createBindGroup({
|
device.createBindGroup({
|
||||||
label: "cell bind group 0",
|
label: "gltf bind group 0",
|
||||||
layout: bindGroupLayouts[0],
|
layout: bindGroupLayouts[0],
|
||||||
entries: [{
|
entries: [{
|
||||||
binding: 0,
|
binding: 0,
|
||||||
@ -172,15 +180,29 @@ class GltfRenderer {
|
|||||||
}, {
|
}, {
|
||||||
binding: 2,
|
binding: 2,
|
||||||
resource: this.sampler,
|
resource: this.sampler,
|
||||||
}, {
|
|
||||||
binding: 3,
|
|
||||||
resource: this.texture,
|
|
||||||
}]
|
}]
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
this.materialBindGroups = [];
|
||||||
|
for (let i = 0; i < this.gltf.json.materials.length; i++) {
|
||||||
|
const material = this.gltf.json.materials[i];
|
||||||
|
const bindGroup = device.createBindGroup({
|
||||||
|
label: `gltf bind group material ${i}`,
|
||||||
|
layout: bindGroupLayouts[1],
|
||||||
|
entries: [{
|
||||||
|
binding: 0,
|
||||||
|
resource: this.textures[material.pbrMetallicRoughness.baseColorTexture.index],
|
||||||
|
}, {
|
||||||
|
binding: 1,
|
||||||
|
resource: this.textures[material.emissiveTexture.index],
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
this.materialBindGroups.push(bindGroup);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPrimitive(renderPass, accessors, indices, nodeIndex)
|
renderPrimitive(renderPass, accessors, primitive, nodeIndex)
|
||||||
{
|
{
|
||||||
for (let i = 0; i < accessors.length; i++) {
|
for (let i = 0; i < accessors.length; i++) {
|
||||||
const accessor = accessors[i];
|
const accessor = accessors[i];
|
||||||
@ -190,7 +212,7 @@ class GltfRenderer {
|
|||||||
renderPass.setVertexBuffer(i, this.buffers[bufferView.buffer], bufferView.byteOffset, bufferView.byteLength);
|
renderPass.setVertexBuffer(i, this.buffers[bufferView.buffer], bufferView.byteOffset, bufferView.byteLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
const indicesAccessor = this.gltf.json.accessors[indices];
|
const indicesAccessor = this.gltf.json.accessors[primitive.indices];
|
||||||
const indicesBufferView = this.gltf.json.bufferViews[indicesAccessor.bufferView];
|
const indicesBufferView = this.gltf.json.bufferViews[indicesAccessor.bufferView];
|
||||||
renderPass.setIndexBuffer(this.buffers[indicesBufferView.buffer],
|
renderPass.setIndexBuffer(this.buffers[indicesBufferView.buffer],
|
||||||
"uint16",
|
"uint16",
|
||||||
@ -198,6 +220,7 @@ class GltfRenderer {
|
|||||||
indicesBufferView.byteLength);
|
indicesBufferView.byteLength);
|
||||||
|
|
||||||
renderPass.setBindGroup(0, this.bindGroups[0]);
|
renderPass.setBindGroup(0, this.bindGroups[0]);
|
||||||
|
renderPass.setBindGroup(1, this.materialBindGroups[primitive.material]);
|
||||||
//console.log("drawIndexed", nodeIndex);
|
//console.log("drawIndexed", nodeIndex);
|
||||||
renderPass.drawIndexed(indicesAccessor.count, 1, 0, 0, nodeIndex);
|
renderPass.drawIndexed(indicesAccessor.count, 1, 0, 0, nodeIndex);
|
||||||
//renderPass.drawIndexed(indicesAccessor.count);
|
//renderPass.drawIndexed(indicesAccessor.count);
|
||||||
@ -215,7 +238,7 @@ class GltfRenderer {
|
|||||||
renderPass.setPipeline(this.renderPipelines[key]);
|
renderPass.setPipeline(this.renderPipelines[key]);
|
||||||
lastKey = key;
|
lastKey = key;
|
||||||
const primitive = mesh.primitives[j];
|
const primitive = mesh.primitives[j];
|
||||||
this.renderPrimitive(renderPass, accessors, primitive.indices, nodeIndex);
|
this.renderPrimitive(renderPass, accessors, primitive, nodeIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,7 +348,7 @@ async function loadGltf(device, canvasFormat, viewUniformBuffer, memory, module)
|
|||||||
|
|
||||||
const textures = await loadTextures(device, memory, module, gltf);
|
const textures = await loadTextures(device, memory, module, gltf);
|
||||||
|
|
||||||
const renderer = new GltfRenderer(device, canvasFormat, viewUniformBuffer, shaderModule, gltf, textures[2]);
|
const renderer = new GltfRenderer(device, canvasFormat, viewUniformBuffer, shaderModule, gltf, textures);
|
||||||
console.log(renderer.nodeBuffer);
|
console.log(renderer.nodeBuffer);
|
||||||
device.queue.writeBuffer(renderer.nodeBuffer, 0,
|
device.queue.writeBuffer(renderer.nodeBuffer, 0,
|
||||||
memory.buffer, nodesHandle, (4 * 4 * 4) * gltf.json.nodes.length);
|
memory.buffer, nodesHandle, (4 * 4 * 4) * gltf.json.nodes.length);
|
||||||
|
|||||||
@ -33,5 +33,5 @@ fn vertexMain(input: VertexInput) -> VertexOutput
|
|||||||
@fragment
|
@fragment
|
||||||
fn fragmentMain(input: VertexOutput) -> @location(0) vec4f
|
fn fragmentMain(input: VertexOutput) -> @location(0) vec4f
|
||||||
{
|
{
|
||||||
return vec4(1, 0, 0, 1.0);
|
return vec4(1, 1, 1, 1.0);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user