【发布时间】:2019-03-15 00:59:12
【问题描述】:
只关注单个顶点/片段着色器对的制服/属性/变化,我想知道您如何使用textures 对以下系统进行建模。专注于 2D。
- 位置:当前对象的position。
- 翻译:next position 建议的对象是基于预先的一些 CPU 计算。
- velocity:物体的速度。
- rotation:对象下一次旋转。
- 力(如重力或碰撞):对象在各个方向上作用在其上的力的总和。
- 温度:对象的温度。
- 质量/密度:物体的质量/密度。
- 曲率:沿预定义的曲线移动(如缓动)。
起初我想这样做:
attribute vec3 a_position;
attribute vec3 a_translation;
attribute vec3 a_velocity;
attribute vec3 a_rotation;
attribute vec3 a_force;
attribute vec3 a_temperature;
attribute vec3 a_material; // mass and density
attribute vec4 a_color;
attribute vec4 a_curvature;
但这可能会遇到too many attributes的问题。
所以我记得using textures 。无需过多详细说明,我只是想知道您如何构建制服/属性/变化来完成此操作。
attribute vec2 a_position_uv;
attribute vec2 a_translation_uv;
attribute vec2 a_velocity_uv;
attribute vec2 a_rotation_uv;
attribute vec2 a_force_uv;
attribute vec2 a_temperature_uv;
attribute vec2 a_material_uv;
attribute vec2 a_color_uv;
attribute vec2 a_curvature_uv;
如果我们这样做,所有属性都引用纹理坐标,那么纹理可能会存储vec4 数据,这样我们就可以避免属性过多的问题。
但我现在不确定如何为两个着色器定义纹理。想知道是不是这样:
uniform sampler2D u_position_texture;
uniform sampler2D u_translation_texture;
uniform sampler2D u_velocity_texture;
uniform sampler2D u_rotation_texture;
uniform sampler2D u_force_texture;
uniform sampler2D u_temperature_texture;
uniform sampler2D u_material_texture;
uniform sampler2D u_color_texture;
uniform sampler2D u_curvature_texture;
然后在顶点着色器的main中,我们可以使用纹理来计算位置。
void main() {
vec4 position = texture2D(u_position_texture, a_position_uv);
vec4 translation = texture2D(u_translation_texture, a_translation_uv);
// ...
gl_Position = position * ...
}
通过这种方式,我们不需要在顶点着色器中使用任何varyings 来传递颜色,除非我们想在片段着色器中使用我们的计算结果。但我可以弄清楚那部分。现在我只想知道是否可以像这样构造着色器,所以最终的顶点着色器将是:
attribute vec2 a_position_uv;
attribute vec2 a_translation_uv;
attribute vec2 a_velocity_uv;
attribute vec2 a_rotation_uv;
attribute vec2 a_force_uv;
attribute vec2 a_temperature_uv;
attribute vec2 a_material_uv;
attribute vec2 a_color_uv;
attribute vec2 a_curvature_uv;
uniform sampler2D u_position_texture;
uniform sampler2D u_translation_texture;
uniform sampler2D u_velocity_texture;
uniform sampler2D u_rotation_texture;
uniform sampler2D u_force_texture;
uniform sampler2D u_temperature_texture;
uniform sampler2D u_material_texture;
uniform sampler2D u_color_texture;
uniform sampler2D u_curvature_texture;
void main() {
vec4 position = texture2D(u_position_texture, a_position_uv);
vec4 translation = texture2D(u_translation_texture, a_translation_uv);
// ...
gl_Position = position * ...
}
最终的片段着色器可能是这样的:
uniform sampler2D u_position_texture;
uniform sampler2D u_translation_texture;
uniform sampler2D u_velocity_texture;
uniform sampler2D u_rotation_texture;
uniform sampler2D u_force_texture;
uniform sampler2D u_temperature_texture;
uniform sampler2D u_material_texture;
uniform sampler2D u_color_texture;
uniform sampler2D u_curvature_texture;
varying vec2 v_foo
varying vec2 v_bar
void main() {
// ...
gl_Color = position * ... * v_foo * v_bar
}
【问题讨论】: