繁体   English   中英

如何实施广告牌?

[英]How to implement billboarding?

我目前在3D世界中绘制一个平面(三角形条带)。 我现在想把它画成一个广告牌 - 所以脸部与相机对齐。

这是代码:

#version 330 core

layout(points) in;
layout(triangle_strip, max_vertices=4) out;
out vec2 tex_coord;

uniform mat4x4 model;
uniform mat4x4 view;
uniform mat4x4 projection;

uniform float size = 1.0;

// texture coordinates
const vec2 texc[4] = vec2[] (vec2(0, 0),
                             vec2(0, 1),
                             vec2(1, 0),
                             vec2(1, 1));

void main() {
    // vertex offsets from the center point
    float asize = size / 2;
    vec4 offset[4] = vec4[] (vec4(-asize, 0.0, -asize, 0.0),
                             vec4(-asize, 0.0,  asize, 0.0),
                             vec4( asize, 0.0, -asize, 0.0),
                             vec4( asize, 0.0,  asize, 0.0));
    int i, j;
    for(i = 0; i < gl_in.length(); ++i) {
        for(j = 0; j < 4; ++j) {

            // vector coordinates
            vec4 vertexpos = (gl_in[i].gl_Position + offset[j]);
            vec4 position = projection * view * model * vertexpos;
            gl_Position = position;

            tex_coord = texc[j];
            EmitVertex();
        }
        EndPrimitive();
    }
}

显然输出只是一个平面:

在此输入图像描述

如何更改代码以将平面绘制为广告牌? 我知道我必须利用视图矩阵计算顶点坐标(在内环中),但我无法弄清楚如何。

项目gl_in[i].gl_Position 之后添加offset

int i, j;
for(i = 0; i < gl_in.length(); ++i) 
{
    vec4 centerpt = projection * view * model * gl_in[i].gl_Position;
    for(j = 0; j < 4; ++j) 
    {
        gl_Position = centerpt + offset[j];
        tex_coord = texc[j];
        EmitVertex();
    }
    EndPrimitive();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM