Java lwjgl附加或联合形状以使透明度看起来正确

Java lwjgl附加或联合形状以使透明度看起来正确,java,lwjgl,Java,Lwjgl,我想弄清楚这件事已经有一段时间了。有没有办法将已渲染的多个形状变成一个对象?所以你可以用任何你想要的方式操纵这个对象?目前,如果我尝试使用glcolor方法,它不会改变任何东西,因为我已经有多个颜色改变了对象。也许我没有意识到一些明显的东西,或者只是一些我在任何教程中都找不到的东西。但简单地说,我正在寻找一种方法,只改变多个形状的alpha值,将其绘制在一起,形成一个更复杂的形状,但保留已预定义的颜色。如果希望多个形状成为一个对象,只需计算或将正确的X、Y、Z数字写入每个顶点,因此,它们结合在一

我想弄清楚这件事已经有一段时间了。有没有办法将已渲染的多个形状变成一个对象?所以你可以用任何你想要的方式操纵这个对象?目前,如果我尝试使用glcolor方法,它不会改变任何东西,因为我已经有多个颜色改变了对象。也许我没有意识到一些明显的东西,或者只是一些我在任何教程中都找不到的东西。但简单地说,我正在寻找一种方法,只改变多个形状的alpha值,将其绘制在一起,形成一个更复杂的形状,但保留已预定义的颜色。

如果希望多个形状成为一个对象,只需计算或将正确的X、Y、Z数字写入每个顶点,因此,它们结合在一起

例如,你可以把两个三角形变成一个正方形,就像这样

glBegin(GL_TRIANGLES);

glVertex3f(0f, 0f, 0f);
glVertex3f(0f, 100f, 0f);
glVertex3f(100f, 0f, 0f);

glVertex3f(100f, 100f, 0f);
glVertex3f(100f, 0f, 0f);
glVertex3f(0f, 100f, 0f);

glEnd();

做同样的事情,但在代码中看起来是这样的

glBegin(GL_TRIANGLES);

glVertex3f(0f, 0f, 0f);
glVertex3f(0f, 100f, 0f);
glVertex3f(100f, 0f, 0f);

glVertex3f(100f, 100f, 0f);
glVertex3f(100f, 0f, 0f);
glVertex3f(0f, 100f, 0f);

glEnd();
当然,您可以只使用
GL_四边形
,尽管三角形通常在很多方面都更好。如果要为形状1的颜色上色,则需要并且只能在之前写入一种颜色

例如,这将起作用,并给出一个完整的红色正方形/四边形

glColor3f(1f, 0f, 0f);

glBegin(GL_TRIANGLES);

glVertex3f(0f, 0f, 0f);
glVertex3f(0f, 100f, 0f);
glVertex3f(100f, 0f, 0f);

glVertex3f(100f, 100f, 0f);
glVertex3f(100f, 0f, 0f);
glVertex3f(0f, 100f, 0f);

glEnd();
不过,如果您在两者之间添加更多的
glColor
,最终将得到另一个结果

如果要使用透明度/不透明度/alpha,则需要使用
glColor4f
,其中最后一个数字是透明度的大小。但在您能够使用透明度之前,您需要在OpenGL中启用混合模式。你可以打电话来

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我对你的问题不是百分之百的肯定,所以如果我忘记回答什么,就写一条评论告诉我

信息 如果您没有静态导入类,那么请记住
glEnable(GL\u-BLEND)实际上是
GL11.glEnable(GL11.glu-BLEND),其余代码也是如此


还要记住,
glVertex
glNormal
glColor
等都是不推荐使用的方法,因此不应使用,而且它们在渲染大量顶点时速度非常慢,,尽管它们对于学习OpenGL非常有用,而且只能用于学习。新的更好的替代方法是使用VBO和着色器。

如果您希望多个形状成为一个对象,只需计算或将正确的X、Y、Z数字写入每个顶点,使它们组合在一起

例如,你可以把两个三角形变成一个正方形,就像这样

glBegin(GL_TRIANGLES);

glVertex3f(0f, 0f, 0f);
glVertex3f(0f, 100f, 0f);
glVertex3f(100f, 0f, 0f);

glVertex3f(100f, 100f, 0f);
glVertex3f(100f, 0f, 0f);
glVertex3f(0f, 100f, 0f);

glEnd();

做同样的事情,但在代码中看起来是这样的

glBegin(GL_TRIANGLES);

glVertex3f(0f, 0f, 0f);
glVertex3f(0f, 100f, 0f);
glVertex3f(100f, 0f, 0f);

glVertex3f(100f, 100f, 0f);
glVertex3f(100f, 0f, 0f);
glVertex3f(0f, 100f, 0f);

glEnd();
当然,您可以只使用
GL_四边形
,尽管三角形通常在很多方面都更好。如果要为形状1的颜色上色,则需要并且只能在之前写入一种颜色

例如,这将起作用,并给出一个完整的红色正方形/四边形

glColor3f(1f, 0f, 0f);

glBegin(GL_TRIANGLES);

glVertex3f(0f, 0f, 0f);
glVertex3f(0f, 100f, 0f);
glVertex3f(100f, 0f, 0f);

glVertex3f(100f, 100f, 0f);
glVertex3f(100f, 0f, 0f);
glVertex3f(0f, 100f, 0f);

glEnd();
不过,如果您在两者之间添加更多的
glColor
,最终将得到另一个结果

如果要使用透明度/不透明度/alpha,则需要使用
glColor4f
,其中最后一个数字是透明度的大小。但在您能够使用透明度之前,您需要在OpenGL中启用混合模式。你可以打电话来

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
我对你的问题不是百分之百的肯定,所以如果我忘记回答什么,就写一条评论告诉我

信息 如果您没有静态导入类,那么请记住
glEnable(GL\u-BLEND)实际上是
GL11.glEnable(GL11.glu-BLEND),其余代码也是如此


还要记住,
glVertex
glNormal
glColor
等都是不推荐使用的方法,因此不应使用,而且它们在渲染大量顶点时速度非常慢,,尽管它们对于学习OpenGL非常有用,只能用于学习。新的更好的替代方法是使用VBO和着色器。

感谢您深思熟虑的回答,我的问题您是正确的。我只是希望有更快的方法为懒惰的人画复杂的形状pWell使用glVertex、glColor、glNormal等方法。它们实际上已被弃用。现在假设您使用VBO和着色器,您知道它们是什么吗,否则我可以编辑我的答案以向您展示!:)实际上我刚刚找到了我要找的东西。它被称为“渲染到纹理”。我一开始没有用这种方式搜索它,感觉很傻。谢谢编辑:我已经看了lwjgl一段时间了。这和我做过的其他事情有点不同。开始更好地掌握它。我想无论如何谢谢你深思熟虑的回答,我的问题你是对的。我只是希望有更快的方法为懒惰的人画复杂的形状pWell使用glVertex、glColor、glNormal等方法。它们实际上已被弃用。现在假设您使用VBO和着色器,您知道它们是什么吗,否则我可以编辑我的答案以向您展示!:)实际上我刚刚找到了我要找的东西。它被称为“渲染到纹理”。我一开始没有用这种方式搜索它,感觉很傻。谢谢编辑:我已经看了lwjgl一段时间了。这和我做过的其他事情有点不同。开始更好地掌握它。我想无论如何P