MetalTexturedMesh/Shaders.metal
/*  | 
Copyright (C) 2016 Apple Inc. All Rights Reserved.  | 
See LICENSE.txt for this sample’s licensing information  | 
Abstract:  | 
Shader file with functions for rendering lit, textured geometry.  | 
*/  | 
#include <metal_stdlib>  | 
using namespace metal;  | 
struct Constants { | 
float4x4 modelViewProjectionMatrix;  | 
float3x3 normalMatrix;  | 
};  | 
constant half3 ambientLightIntensity(0.1, 0.1, 0.1);  | 
constant half3 diffuseLightIntensity(0.9, 0.9, 0.9);  | 
constant half3 lightDirection(-0.577, -0.577, -0.577);  | 
struct VertexIn { | 
packed_float3 position;  | 
packed_float3 normal;  | 
packed_float2 texCoords;  | 
};  | 
struct VertexOut { | 
float4 position [[position]];  | 
float3 normal;  | 
float2 texCoords;  | 
};  | 
vertex VertexOut vertex_transform(device VertexIn *vertices [[buffer(0)]],  | 
constant Constants &uniforms [[buffer(1)]],  | 
uint vertexId [[vertex_id]])  | 
{ | 
float3 modelPosition = vertices[vertexId].position;  | 
float3 modelNormal = vertices[vertexId].normal;  | 
VertexOut out;  | 
// Multiplying the model position by the model-view-projection matrix moves us into clip space  | 
out.position = uniforms.modelViewProjectionMatrix * float4(modelPosition, 1);  | 
// Copy the vertex normal and texture coordinates  | 
out.normal = uniforms.normalMatrix * modelNormal;  | 
out.texCoords = vertices[vertexId].texCoords;  | 
return out;  | 
}  | 
fragment half4 fragment_lit_textured(VertexOut fragmentIn [[stage_in]],  | 
texture2d<float, access::sample> tex2d [[texture(0)]],  | 
sampler sampler2d [[sampler(0)]])  | 
{ | 
// Sample the texture to get the surface color at this point  | 
half3 surfaceColor = half3(tex2d.sample(sampler2d, fragmentIn.texCoords).rrr);  | 
// Re-normalize the interpolated surface normal  | 
half3 normal = normalize(half3(fragmentIn.normal));  | 
// Compute the ambient color contribution  | 
half3 color = ambientLightIntensity * surfaceColor;  | 
// Calculate the diffuse factor as the dot product of the normal and light direction  | 
float diffuseFactor = saturate(dot(normal, -lightDirection));  | 
// Add in the diffuse contribution from the light  | 
color += diffuseFactor * diffuseLightIntensity * surfaceColor;  | 
return half4(color, 1);  | 
}  | 
Copyright © 2016 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2016-09-13