El metal es la base para gráficos acelerados y poder de cómputo en las plataformas de Apple, y si está familiarizado con C++, ahora es el momento perfecto para explorar su increíble poder. Para este desafío, lo invitamos a probar metal-cpp y renderizar su propio triángulo, esfera o incluso una malla en Xcode.
¡También lo invitamos a visitar el Graphics & Games Study Hall durante el día para colaborar en este desafío! Haga preguntas, conéctese con otros desarrolladores y comparta sus creaciones.
Empieza el reto
Antes de comenzar, querrá ver “Programa Metal en C++ con metal-cpp” y descargar el proyecto LearnMetalCPP, que contiene una serie de ejemplos de C++.
Programa Metal en C++ con metal-cpp
Tus juegos y aplicaciones de C++ ahora pueden aprovechar el poder de Metal. Le mostraremos cómo metal-cpp lo ayuda a unir su código C++ con Metal, explorar cómo cada uno administra los ciclos de vida de los objetos y demostrar las utilidades que pueden ayudar a que estos lenguajes cooperen en su aplicación. También compartiremos las mejores prácticas para diseñar…
Descarga el proyecto LearnMetalCPP
Abra el proyecto en Xcode y elija 00-window.cpp como su código base. Para renderizar su imagen, deberá configurar algunas cosas dentro de su proyecto.
Primero, crea un MTL::RenderPipelineState
objeto con un MTL::RenderPipelineDescriptor
. Para hacer esto, deberá crear una función, como buildShaders()
. En el fragmento de código a continuación, proporcionamos el código de sombreado necesario para representar un solo triángulo.
void Renderer::buildShaders()
{
using NS::StringEncoding::UTF8StringEncoding;
const char* shaderSrc = R"(
#include <metal_stdlib>
using namespace metal;
struct AAPLVertex
{
float3 position;
half3 color;
};
// Welcome to modify the mesh as you want
constant AAPLVertex triangles[] = {
{ float3{ -0.8f, 0.8f, 0.0f }, half3{ 1.0, 0.3f, 0.2f } },
{ float3{ 0.0f, -0.8f, 0.0f }, half3{ 0.8f, 1.0, 0.0f } },
{ float3{ +0.8f, 0.8f, 0.0f }, half3{ 0.8f, 0.0f, 1.0 } }
};
struct v2f
{
float4 position [[position]];
half3 color;
};
v2f vertex vertexMain( uint vertexId [[vertex_id]])
{
v2f o;
o.position = float4( triangles[ vertexId ].position, 1.0 );
o.color = half3 ( triangles[ vertexId ].color );
return o;
}
half4 fragment fragmentMain( v2f in [[stage_in]] )
{
return half4( in.color, 1.0 );
}
)";
}
Luego, extienda la Renderer::draw( MTK::View* pView)
función configurando un MTL::RenderPipelineState
e insertar sorteos.
void Renderer::draw( MTK::View* pView )
{
...
...
}
Después:
- Crear el
MTL::RenderPipelineDescriptor
objeto y configurar algunas propiedades. - Crear el
MTL::RenderPipelineState
objeto. - Sugerencia: tenga cuidado con los ciclos de vida de los objetos.
¿Listo para compartir tu arte de metal-cpp con la comunidad? Muéstranos lo que has hecho en Twitter con el hashtag #WWDC22Challenges, o comparte tu trabajo en Graphics & Games Study Hall. Y si desea hablar sobre metal-cpp y otros temas de gráficos y juegos, únase al equipo en los eventos durante toda la semana en WWDC22.
Explore #WWDC22Challenges en las redes sociales
Lee los términos y condiciones de los desafíos de la WWDC22