我想将Alpha / Blend模式用于未来的东西(主要是交易和可能的图像混合) .
好吧,我无法使用LWJGL(GL1.1)工作,我已经尝试过其他混合模式但没有工作,也没有改变背景或类似的东西......
截图:
-
http://i.imgur.com/cHU4YGS.png - GL_BLEND始终启用,一切都是透明的
-
http://i.imgur.com/sPmPqne.png - 在QUAD和文本上启用了GL_BLEND,我可以看到禁用的行GL_BLEND
-
我imgur com / nkda41v png - 除了文本之外的所有内容都禁用了GL_BLEND - >我需要一些声望来发布超过2个链接,抱歉,但我相信这个图像很重要,所以无论如何我都会发布它 . 只需填充点
所有这些测试的结果都是相同的,有或没有alpha参数
代码:
` private void init() {
try {
Display.setDisplayMode(new DisplayMode(DEFAULT_WIDTH, DEFAULT_HEIGHT));
Display.setResizable(true);
Display.setVSyncEnabled(true);
Display.setTitle(DEFAULT_TITLE + " v" + VERSION);
Display.create();
updateMatrix();
} catch(LWJGLException e) {
e.printStackTrace();
}
Keyboard.enableRepeatEvents(true);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Font consolas = new Font("consolas", Font.PLAIN, 13);
font = new TrueTypeFont(consolas, antiAliasedFont);
}
private void updateMatrix() {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0, 1, -1);
//glScaled((double) DEFAULT_WIDTH / (double) Display.getWidth(), (double) DEFAULT_HEIGHT / (double) Display.getHeight(), 0);
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glMatrixMode(GL_MODELVIEW);
}
@Override
public void run() {
init();
Main main = Main.getMain();
while(!Display.isCloseRequested()) {
currentGraphicsTick++;
{
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0f, 0f, 0f, 1f);
if(Display.wasResized()) updateMatrix();
if(vsyncMode == 1) Display.setVSyncEnabled(true);
else if(vsyncMode == 2) Display.setVSyncEnabled(false);
if(Display.isActive()) {
glPushMatrix();
try { // Draw
float alpha = (float) Math.cos(Math.toRadians(currentGraphicsTick % 90));
System.out.println("Alpha: " + alpha);
glBegin(GL_LINE_STRIP);
{
float sin = (float) Math.abs(Math.sin(Math.toRadians(currentGraphicsTick % 360)));
new Color(0.7f, 0.7f, 0.7f, alpha).bind();
glVertex2f(DEFAULT_WIDTH * 0.03f, DEFAULT_HEIGHT * 0.05f);
glVertex2f(DEFAULT_WIDTH * 0.93f * sin, DEFAULT_HEIGHT * 0.95f * sin);
}
glEnd();
glBegin(GL_QUAD_STRIP);
{
new Color(0.5f, 0.5f, 0.5f, alpha).bind();
glVertex2i(0, 0);
glVertex2i(0, DEFAULT_HEIGHT);
glVertex2i(DEFAULT_WIDTH, 0);
glVertex2i(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
glEnd();
String[] split = main.getGameLoopThread().getDebugString().split("\n");
for(int i = 0; i < split.length; i++) {
font.drawString(1, 1 + (i * font.getLineHeight()), split[i], Color.white);
}
} catch(Throwable throwable) {
throwable.printStackTrace();
}
glPopMatrix();
}
Display.update();
Display.sync(TARGET_FPS);
}
}
Display.destroy();
closeRequested = true;
}
我已经尝试过了:
-
从Slick的Color构造函数中删除'alpha'参数
-
使用带有和不带alpha参数的OpenGL的 glColor
-
在部分代码中禁用/启用 GL_BLEND (我知道有些东西不起作用,但你永远都不知道,对吧?)
-
使用 constants 到alpha变量(例如0.3f,0.5f,0.7f,1f)而不是通过 Math.sin / cos 使用刻度作为度数使其变量
-
使用 glRect(...)
-
更改背景
-
删除 glClearColor
-
正在删除 glClear (效果很好,从未做过这个大声笑)
我期待看到的是一个正在消失的LINE_STRIP:
-
一方面它从 (0, 0) 移动到 (width - 7%, height - 5%)
-
另一方面,它仍然停留在 (width + 3%, height + 5%)
-
矩形会让它变淡(最初的想法会使用与背景相同的颜色,但它在我的测试中没有,因为我想看到矩形)
2 回答
在使用我自己的引擎进行2D游戏时,我有类似的(就我必须解决的问题而言) . LWJGL的混合函数总是有一些问题,并没有真正那么多的具体答案,因为它真的归结为你的代码和你如何放置东西 .
我认为你正在使用SlickUtil,我会说你自己编写(或者当然搜索)你自己的方法 . Util的方法总是有点混乱 .
删除alpha在获得你想要的东西方面不应该有太大变化
我唯一一次明确启用GL_BLEND是在渲染灯光时(总是假设你正在做3D)以及何时渲染纹理
我建议不要删除glClearColor,只要你把它放在正确的地方就不会直接影响你的情况
就像我说的这个错误/问题可能是由于很多事情,我不能完全指出你发布的内容 .
我的建议是:
很好地组织整个项目,以便能够快速指出错误
尽快制作一些通用的东西(如果你只是想快速写东西,这无关紧要)
避免SlickUtil,它是_2387103的问题
抱歉,我不能帮助太多,但是从您发布的混乱代码中追踪您的问题有点困难 . 我将密切关注这个问题,以防我将来有所帮助 .
除了来自@Juxhin的提示之外,修复我的alpha混合问题的是来自SlickUtils的 TextureImpl.bindNone(); (查看下面的openGL类似)
在渲染需要混淆的东西之前,此方法类似于 glDisable(GL_TEXTURE_2D) (我知道搜索和检查Slick的源代码)