当前位置: 首页 > 知识库问答 >
问题:

OpenGL LWJGL纹理渲染失败

隗新霁
2023-03-14

使用LWJGL的OpenGL版本1.1和2D纹理,我发现自己卡住了...

出于某种原因,LWJGL引擎不会在2D图层上渲染加载的纹理...相反,我得到了一个白色正方形...

我假设我很有可能在代码的某个地方遗漏了什么..以下是与此类事件相关的全部代码..

加载OpenGL环境:

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glEnable(GL_TEXTURE_2D);
glClearColor(0, 0, 0, 1);
glClearDepth(1);
glClearStencil(0);
glColor3f(1.0f, 1.0f, 1.0f);

进入2D绘图模式(用于绘制纯色正方形的功能-通过glcolor函数进行测试,然后通过glvertex调用尺寸):

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

加载映像(已通过Swing测试环境验证其功能正常):

this.ref = ref;
if (!fmt.isImage()) {
    return;
}
f = new File("file/path/to/image.gif");
if (!f.exists() || !f.canRead()) {
    return;
}
BufferedImage tmp = ImageIO.read(f);
WritableRaster raster = WritableRaster.createInterleavedRaster(DataBuffer.TYPE_BYTE, tmp.getWidth(), tmp.getHeight(), 4, null);
img = new BufferedImage(glColorModel, raster, false, new Hashtable());
Graphics g = img.getGraphics();
g.setColor(new Color(0, 0, 0, 0));
g.fillRect(0, 0, img.getWidth(), img.getHeight());
g.drawImage(tmp, 0, 0, null);
g.dispose();

转换图像数据:

byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
buff = ByteBuffer.allocateDirect(data.length);
buff.put(data);
buff.flip();

将数据移入OpenGL缓冲区:

id = glGenTextures();
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
             GL_UNSIGNED_BYTE, buff);

在 2D 表面上绘制纹理:

glBindTexture(GL_TEXTURE_2D, tex.getId());
glTranslatef(x, y, 0);
glBegin(GL_QUADS);
{
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);
    glTexCoord2f(w, 0);
    glVertex2f(w, 0);
    glTexCoord2f(w, h);
    glVertex2f(w, h);
    glTexCoord2f(0, h);
    glVertex2f(0, h);
}
glEnd();

我对LWJGL甚至OpenGL都没有确切的经验,但是,作为一名Java开发人员,并且已经研究了几些示例源代码,此代码对我来说看起来很合适......

最终,我的问题是“我如何解决这个问题?”我添加了“glEnable(GL _ TEXTURE _ 2D);”在输入这段代码时,这导致了绘图区域从白色变成了血红色...

共有1个答案

甄飞飙
2023-03-14

在OpenGL中,纹理坐标从[0,0](表示左下角)到[1,1](右上角)。当纹理坐标超出此范围,并且GL_texture_WRAP_[R|S| T]设置为GL_REPEAT(默认情况下)时,纹理中的实际查找位置由以下公式计算:

lookup.xy = fract(texCoord.xy)

在这里给出的特殊情况下,纹理坐标的范围从0到w,这将导致纹理的w重复。由于视口宽度也设置为 w,因此每次重复的宽度仅为 1px。

 类似资料:
  • 渲染纹理是一张在 GPU 上的纹理。通常我们会把它设置到相机的 目标纹理 上,使相机照射的内容通过离屏的 frambuffer 绘制到该纹理上。一般可用于制作汽车后视镜,动态阴影等功能。 使用 RenderTexture // 方法一:把 3D 相机照射的内容绘制到 UI 的精灵帧上 export class CaptureToWeb extends Component { @proper

  • 纹理根本不渲染,几何体都是黑色的。 截图:http://i.imgur.com/ypMdQY4.png 代码:http://pastebin.com/SvB8rxxt 我也会链接到我试图渲染的纹理和transformations.py模块,但是我没有被允许放置两个以上链接的声誉。谷歌搜索“现代opengl 02”会给你前者的教程,“转换py”会给你后者。 搜索“纹理材料开始”以查找纹理材料的设置位

  • 我试图弄清楚为什么我不能用LWJGL 3渲染任何纹理。我尝试了多种加载(PNGDecoder、STB、BufferedImage)和渲染纹理的方法。但结果总是一个白色的四边形。 主要类: 加载方法: 渲染方法: ModelTexture类只是存储一些现在不使用的信息,blue.png是16x16的png文件。 这是我在启动程序时得到的输出:

  • 方法 构造函数 参数 类型 名称 备注 width number 宽 height number 高 返回值: 类型 名称 备注 Object BK.RenderTexture对象 例子: var renderTexture = new BK.RenderTexture(BK.Director.screenPixelSize.width, BK.Director.screenPixelSize.h

  • 我正在尝试使用OpenGL GLSL着色器渲染到纹理。首先,我尝试用白色填充30x30纹理的每个像素。我将顶点着色器索引从0传递到899,表示纹理的每个像素。对吗?顶点着色器: 片段着色器:

  • 我正在修改锻造模型,我的物品不会被渲染。以下是错误: 这里有一些有用的文件...ItemSkygem.json