User interface 我可以把一个矩形表示为xywhrgb吗?
我正在学习OpenGL,并且一直在尝试为GUI创建小部件。将单色框渲染为User interface 我可以把一个矩形表示为xywhrgb吗?,user-interface,opengl,graphics,glsl,User Interface,Opengl,Graphics,Glsl,我正在学习OpenGL,并且一直在尝试为GUI创建小部件。将单色框渲染为(pos,color)[4]对我来说似乎有点浪费。有没有办法将其压缩到(x,y,w,h,color) 我不会画足够多的矩形,这会很重要,但我很好奇 注意:为了方便起见,我用一个元组表示每个顶点/对象。好吧,您可以通过某种方式将代码抽象到使用这些参数的某个类,就像SDL2所做的那样。没有OpenGL类可以帮助您解决这些问题。比如: struct Vertex { glm::vec3 position; glm:
(pos,color)[4]
对我来说似乎有点浪费。有没有办法将其压缩到(x,y,w,h,color)
我不会画足够多的矩形,这会很重要,但我很好奇
注意:为了方便起见,我用一个元组表示每个顶点/对象。好吧,您可以通过某种方式将代码抽象到使用这些参数的某个类,就像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 */);
};
struct顶点{
glm::vec3位置;
glm::vec3颜色;
};
类模型{
私人:
std::向量向量向量;
公众:
模型(/*通过OBJ传递顶点或加载模型*/);
};
这就是我使用的,抱歉,没有传递顶点,而是传递无符号整数宽度、无符号整数高度、无符号整数xpo、无符号整数ypo,并将它们传递给变换矩阵。
希望有帮助 好吧,在对Spektre给出的提示进行了一些实验之后,我想我有了一个解决方案 我已经习惯于将形状表示为:
struct Shape {
enum Kind : byte {
LineRect,
FillRect,
...
}
float2 position, extent;
uint color;
Kind kind;
}
顶点着色器获取该结构,并将整个对象连同投影矩阵传递给几何体着色器以生成顶点。几何体着色器将打开kind
,并发射形状的顶点,将每个顶点乘以投影矩阵
此格式需要21个字节(
float
float+float
+float
+uint
+byte
)来表示矩形、圆、等腰三角形以及可能的椭圆。我有理由相信纹理矩形也是可能的,在uv坐标下,color
分为ushort[2]
。是。。。几何体着色器可以从填充矩形的单顶点2个三角形发射…您可以使用它来绘制圆、轮廓等。使用相同的着色器也可以这样,不是吗?是的。。。但在圆的情况下,你们需要发出超量的形状,并在片段中决定是像素在里面还是丢弃。类似这样的情况:因为对单个基本体可以发射的顶点数量有限制。。。您可能对此感兴趣您是否熟悉OpenGL实例?如果你利用了这一点,你可以让你的法线(0,0),(0,1),(1,0),(1,1)
坐标只指定一次,然后对每个实例只指定一个颜色,x,y,w,h等。但是,理想情况下,我希望能够在一次绘制调用中渲染多个对象类型。它可能(不是)最有效,但对我来说,它更容易使用。