我正在尝试将Slick Utils纹理代码转换为STB纹理代码,但是当我运行该程序时,我看到的只是一个黑色的旋转立方体,而立方体的每个面上都应该有一个纹理。我已经尝试过对材质类中的纹理加载进行硬编码,但无法正常工作。它可能在Renderer类中,因为我在OpenGL中加载了纹理,但这可能是不正确的。
材料(即纹理)类
package engine.rendering;
import org.lwjgl.opengl.GL11;
import engine.io.Image;
public class Material {
private int textureID;
public Material(String file) {
textureID = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
Image image = Image.loadImage("res/textures/" + file);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, image.getWidth(), image.getHeight(), 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, image.getImage());
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
public void remove() {
GL11.glDeleteTextures(textureID);
}
public int getTextureID() {
return textureID;
}
}
图像加载程序类
package engine.io;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import org.lwjgl.stb.STBImage;
import org.lwjgl.system.MemoryStack;
public class Image {
public ByteBuffer getImage() {
return image;
}
public int getWidth() {
return width;
}
public int getHeight() {
return heigh;
}
private ByteBuffer image;
private int width, heigh;
Image(int width, int heigh, ByteBuffer image) {
this.image = image;
this.heigh = heigh;
this.width = width;
}
public static Image loadImage(String path) {
ByteBuffer image;
int width, heigh;
try (MemoryStack stack = MemoryStack.stackPush()) {
IntBuffer comp = stack.mallocInt(1);
IntBuffer w = stack.mallocInt(1);
IntBuffer h = stack.mallocInt(1);
image = STBImage.stbi_load(path, w, h, comp, 4);
if (image == null) {
System.err.println("Couldn't load " + path);
}
width = w.get();
heigh = h.get();
}
return new Image(width, heigh, image);
}
}
渲染器类
package engine.rendering;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import engine.io.Window;
import engine.maths.Matrix4f;
import engine.rendering.models.ModelEntity;
import engine.rendering.models.TexturedModel;
import engine.rendering.models.UntexturedModel;
import engine.shaders.BasicShader;
public class Renderer {
private BasicShader shader;
private Window window;
public Renderer(Window window, BasicShader shader) {
this.shader = shader;
this.window = window;
}
public void create() {
shader.loadProjectionMatrix(new Matrix4f().projection(70.0f, (float) window.getWidth() / window.getHeight(), 0.1f, 1000.0f));
}
public void renderModel(UntexturedModel model){
GL30.glBindVertexArray(model.getVertexArrayID());
GL20.glEnableVertexAttribArray(0);
GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
GL20.glDisableVertexAttribArray(0);
GL30.glBindVertexArray(0);
}
public void renderTexturedModel(TexturedModel model){
GL30.glBindVertexArray(model.getVertexArrayID());
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, model.getMaterial().getTextureID());
GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);
}
public void renderModelEntity(ModelEntity entity){
GL30.glBindVertexArray(entity.getModel().getVertexArrayID());
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
shader.loadTransformationMatrix(entity.getTransformationMatrix());
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, entity.getModel().getMaterial().getTextureID());
GL11.glDrawElements(GL11.GL_TRIANGLES, entity.getModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);
}
}
答案 0 :(得分:2)
纹理采样器返回黑色,因为默认的过滤器模式需要mipmap。您可以生成Mipmap(glGenerateMipmaps()
),也可以将过滤器模式更改为不需要Mipmap的模式:
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);