机顶盒加载图像,但显示黑色纹理
STB loads image, but shows black texture
我正在尝试将我的 Slick Utils 纹理代码转移到 STB 纹理代码,但是当我 运行 程序时,我看到的只是一个黑色的旋转立方体,而它的每个面都应该有一个纹理的立方体。我已经尝试在 material class 中对纹理加载进行硬编码,但这不起作用。它可能在渲染器中 class,因为我在 OpenGL 中加载了纹理,但它可能不正确。
Material(即纹理)Class
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;
}
}
图片加载器Class
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);
}
}
渲染器Class
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);
}
}
纹理采样器 returns 黑色,因为默认过滤模式需要 mipmap。您可以生成 mipmaps (glGenerateMipmaps()
),也可以将过滤器模式更改为不需要 mipmaps 的模式:
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
我正在尝试将我的 Slick Utils 纹理代码转移到 STB 纹理代码,但是当我 运行 程序时,我看到的只是一个黑色的旋转立方体,而它的每个面都应该有一个纹理的立方体。我已经尝试在 material class 中对纹理加载进行硬编码,但这不起作用。它可能在渲染器中 class,因为我在 OpenGL 中加载了纹理,但它可能不正确。
Material(即纹理)Class
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;
}
}
图片加载器Class
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);
}
}
渲染器Class
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);
}
}
纹理采样器 returns 黑色,因为默认过滤模式需要 mipmap。您可以生成 mipmaps (glGenerateMipmaps()
),也可以将过滤器模式更改为不需要 mipmaps 的模式:
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);