gpt4 book ai didi

d - 从模板中的结构字段中提取类型和偏移量

转载 作者:行者123 更新时间:2023-12-04 10:42:51 26 4
gpt4 key购买 nike

注意:即使我的示例来自 OpenGL,这也不是 OpenGL 问题,而是一般 D 问题。

背景:在我的游戏项目中,我有着色器类来帮助连接到 GLSL 代码。设置制服效果很好:

uniform(string name, float value) --> glUniform1f(...)
uniform(string name, mat4 m) --> glUniformMatrix4fv( ...)
etc. etc.

也就是说,它根据参数的类型选择正确的函数,因此当我修改代码时,它会自动更改为使用正确的函数(假设我在 D 和 GLSL 之间没有类型冲突)。

我的麻烦是实现了一些类似的机制来绑定(bind)属性。我有顶点结构:
struct VERTEX { ...; vec3 pos; ... }

对于绑定(bind)属性,除了知道字段的类型外,我还需要偏移量,但不需要值。我设法编写了笨拙的实现,其中调用如下所示:
vbo.attrib!(typeof(mesh.VERTEX.pos))("vert_pos", mesh.VERTEX.pos.offsetof);

VBO.attrib 是这样实现的:
void attrib(T: vec2)(string name, ulong offset) { /* 2 floats from offset */ }
void attrib(T: vec3)(string name, ulong offset) { /* 3 floats from offset */ }

问题:有没有办法让这个更简单,更优雅?一般我不喜欢在调用时重复字段,即先提取类型选择正确的属性绑定(bind)函数,然后单独发送偏移量。我希望函数调用看起来像这样:
vbo.attrib("vert_pos", mesh.VERTEX.pos);

...以及从参数中提取类型和偏移量的模板。我已经阅读了 D 模板指南和教程,但我还没有弄清楚如何实现这样的模板。有可能吗?怎么做?

澄清:我感觉我已经很接近了,我只是没有足够的想象力(以及来自 D 模板和 mixins 的知识)来实现第一阶段:
XXX(name, field)
--> some unknown magic
--> vbo.attrib!(typeof(field))(name,field.offsetof)
--> void attrib(T: vec2)(string name, ulong offset) { /* arguments for GL call */ }

编辑:使用 mixins,我设法使它看起来像这样:
    template attrib(string name, string field)
{
const char[] attrib =
"vbo.attrib!" ~
"(typeof(" ~ field ~ "))" ~
"(\"" ~ name ~ "\", " ~ field ~ ".offsetof);";
}

mixin(attrib!("vert_pos", "mesh.VERTEX.pos"));
mixin(attrib!("vert_uv", "mesh.VERTEX.uv"));

老实说,它(调用)看起来比我现在使用的更复杂,所以我保持当前状态并寻找更好看的解决方案。

最佳答案

你真的非常接近解决方案。这适用于 DMD git head:

import std.stdio;

struct vec2 {
float a, b;
}

struct vec3 {
float a, b, c;
}

struct VERTEX {
vec3 pos;
vec2 uv;
}

void attrib(T: vec2) (string name, ulong offset) {
writefln("vec2: name=%s; ofs=%s", name, offset);
}

void attrib(T: vec3) (string name, ulong offset) {
writefln("vec3: name=%s; ofs=%s", name, offset);
}


static void attrib(string name, alias field) () {
attrib!(typeof(field))(name, field.offsetof);
}


void main () {
attrib!("vert_pos", VERTEX.pos); // outputs "vec3: name=vert_pos; ofs=0"
attrib!("vert_uv", VERTEX.uv); // outputs: "vec2: name=vert_uv; ofs=12"
}

不幸的是,我没有官方 2.066 版本来检查它是否适用。这将 不是 肯定可以使用 2.065,所以你对 GDC 不走运(因为它仍在使用 2.065)。

诀窍在于 static ,这意味着“此模板不需要任何上下文”。

p.s.刚刚检查过,是的,这适用于 2.066 版本。

关于d - 从模板中的结构字段中提取类型和偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com