首页 > 解决方案 > LWJGL 3 无法使用与 LWJGL 3 的 slick-util 兼容版本正确渲染纹理

问题描述

我最近开始用 LWJGL 3 重写我的游戏,它是如此不同。我试着找教程,这个人使用了这个与 LWJGL 版本 3 兼容的 slick-util。我按照教程看了将近 3 次 30 分钟的教程,不知道哪里出了问题,我检查了它的 github 存储库,仍然无法弄清楚为什么我无法正确加载纹理。

这是我的代码用我的代码渲染的纹理

这是他的教程的 github 存储库在 此处输入链接描述

这是教程视频 在此处输入链接描述

跳至时间戳:32:02

我真的需要帮助,我尝试了一整天,但无法正常工作!让我知道是否有必要共享代码,因为也许你们中的一个人可能已经有这个错误并且已经知道解决方案。谢谢

标签: javaopenglrendergame-enginelwjgl

解决方案


顶点规范与着色器程序的属性索引不匹配:

pbo = storeData(positionBuffer, 0, 3);
// [...]
cbo = storeData(colorBuffer, 1, 3);
// [...]
tbo = storeData(textureBuffer, 2, 2);

你的顶点着色器:

#version 460 core

in vec3 position;
in vec3 color;
in vec2 textureCoord;

out vec3 passColor;
out vec2 passTextureCoord;

void main() {
  gl_Position = vec4(position, 1.0);
  passColor = color;
  passTextureCoord = textureCoord;
}

你的片段着色器

#version 330 core

in vec3 passColor;
in vec2 passTextureCoord;

out vec4 outColor;

uniform sampler2D tex;

void main() {
  outColor = texture(tex, passTextureCoord);
}

属性索引不会自动枚举 (0, 1, 2, ...)。该属性color甚至没有获得属性索引,因为它不是活动的程序资源。color设置为接口变量passColor,但该变量未在片段着色器中使用。因此,该着色器程序只有 2 个活动属性,并且未指定该属性的属性索引。可能索引是 0position和 1 textureCoord(这是大多数硬件驱动程序会做的),但你不能确定这一点。

顶点着色器属性 indeices使用布局限定符 (GLSL)

#version 460 core

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
layout(location = 2) in vec2 textureCoord;

// [...]

推荐阅读