私のレンダリングコードは常にOpenGLでした。OpenGLがないプラットフォームをサポートする必要があるため、OpenGLとDirect3D 9をラップする抽象化レイヤーを追加する必要があります。Direct3D11は後でサポートします。
TL; DR: OpenGLとDirect3Dの違いにより、プログラマーに冗長性が生じ、データレイアウトが不安定に感じられます。
今のところ、私のAPIは少しこのように動作します。これがシェーダーの作成方法です。
Shader *shader = Shader::Create(
" ... GLSL vertex shader ... ", " ... GLSL pixel shader ... ",
" ... HLSL vertex shader ... ", " ... HLSL pixel shader ... ");
ShaderAttrib a1 = shader->GetAttribLocation("Point", VertexUsage::Position, 0);
ShaderAttrib a2 = shader->GetAttribLocation("TexCoord", VertexUsage::TexCoord, 0);
ShaderAttrib a3 = shader->GetAttribLocation("Data", VertexUsage::TexCoord, 1);
ShaderUniform u1 = shader->GetUniformLocation("WorldMatrix");
ShaderUniform u2 = shader->GetUniformLocation("Zoom");
ここにはすでに問題があります。Direct3Dシェーダーがコンパイルされると、名前で入力属性をクエリする方法がなくなります。どうやら意味論だけが意味を保っています。これが、GetAttribLocation
これらの追加の引数があり、それらがに隠されている理由ShaderAttrib
です。
これが頂点宣言と2つの頂点バッファを作成する方法です。
VertexDeclaration *decl = VertexDeclaration::Create(
VertexStream<vec3,vec2>(VertexUsage::Position, 0,
VertexUsage::TexCoord, 0),
VertexStream<vec4>(VertexUsage::TexCoord, 1));
VertexBuffer *vb1 = new VertexBuffer(NUM * (sizeof(vec3) + sizeof(vec2));
VertexBuffer *vb2 = new VertexBuffer(NUM * sizeof(vec4));
別の問題:情報VertexUsage::Position, 0
はセマンティクスに関心がないため、OpenGL / GLSLバックエンドにはまったく役に立たない。
頂点バッファがデータで満たされるか、またはポイントされると、これはレンダリングコードです。
shader->Bind();
shader->SetUniform(u1, GetWorldMatrix());
shader->SetUniform(u2, blah);
decl->Bind();
decl->SetStream(vb1, a1, a2);
decl->SetStream(vb2, a3);
decl->DrawPrimitives(VertexPrimitive::Triangle, NUM / 3);
decl->Unbind();
shader->Unbind();
あなたはそれが見decl
もう少しだけD3D-のような頂点宣言、それはちょっとレンダリングの世話をするにもよります。これはまったく意味がありますか?よりきれいなデザインは何でしょうか?または良いインスピレーションの源?