我正在学习OpenGL,并且一直在尝试为GUI创建小部件。将单色框渲染为(pos, color)[4]
对我来说似乎有点浪费。有办法将其压缩为(x, y, w, h, color)
吗?
我不会画足够多的矩形,这会很重要,但我很好奇。
注意:为了方便起见,我用元组来表示每个顶点/对象。
好吧,在对Spektre给出的提示进行了一些实验之后,我想我有了一个解决方案。
我已经习惯于将形状表示为:
struct Shape {
enum Kind : byte {
LineRect,
FillRect,
...
}
float2 position, extent;
uint color;
Kind kind;
}
顶点着色器获取该结构,并将整个结构连同投影矩阵一起传递给几何体着色器以生成顶点。几何体着色器打开kind
并发射形状的顶点,将每个顶点乘以投影矩阵。
这种格式需要21个字节(float
+float
+float
+float
+uint
+byte
(来表示矩形、圆、等腰三角形,可能还有椭圆。我有理由相信,纹理矩形也是可能的,其中color
被分割为ushort[2]
作为uv坐标。
好吧,您可以以某种方式将代码抽象为使用这些参数的类,就像SDL2所做的那样。没有OpenGL类可以帮助您解决这些问题。类似:
struct Vertex {
glm::vec3 position;
glm::vec3 color;
};
class Model {
private:
std::vector<Vertex> mVertices;
public:
Model(/* Pass Vertices or Load Model through OBJ */);
};
这就是我使用的,很抱歉,不是传递顶点,传递无符号int宽度、无符号int高度、无符号int-xpos和无符号int-ypos,然后将它们传递到变换矩阵。希望有帮助!