Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL纹理渲染黑色,即使其数据不为空_Java_Opengl_Textures_Lwjgl - Fatal编程技术网

Java OpenGL纹理渲染黑色,即使其数据不为空

Java OpenGL纹理渲染黑色,即使其数据不为空,java,opengl,textures,lwjgl,Java,Opengl,Textures,Lwjgl,我已经在LWJGL OpenGL中编写了一个可以工作的2D批处理渲染器,它可以与颜色一起工作。当我向其添加纹理支持时,渲染的四边形始终为黑色。STBImage读取的数据很好。但它仍然呈现黑色。 以下是着色器:顶点: 片段: 版本450核心 采用vec4 v_颜色; 在vec2 v_TexCoord; 浮动v_指数; 均匀采样2D u_纹理批次[16]; 真空总管{ int索引=intv_索引; gl_FragColor=纹理批次[索引],v_TexCoord*v_颜色; } 渲染器的提交方法 p

我已经在LWJGL OpenGL中编写了一个可以工作的2D批处理渲染器,它可以与颜色一起工作。当我向其添加纹理支持时,渲染的四边形始终为黑色。STBImage读取的数据很好。但它仍然呈现黑色。 以下是着色器:顶点: 片段:

版本450核心 采用vec4 v_颜色; 在vec2 v_TexCoord; 浮动v_指数; 均匀采样2D u_纹理批次[16]; 真空总管{ int索引=intv_索引; gl_FragColor=纹理批次[索引],v_TexCoord*v_颜色; } 渲染器的提交方法

public static void Submit(Texture texture, Rect drawRect, Rect uvRect, Vector4f colour) {
    if (hasRoom) {
        texture.BindSlot(textureIndex + 1);
        int index = spriteCount++;
        int offset = index * 6 * VERTEX_COUNT;
        StoreData(offset, textureIndex++, drawRect, uvRect, colour);
        if (textureIndex >= 16) hasRoom = false;
        if (spriteCount >= maxBatchSize) hasRoom = false;
    }
}
private static void StoreData(int offset, int textureIndex, Rect drawRect, Rect uvRect, Vector4f colour) {
    float x1 = drawRect.x;
    float y1 = drawRect.y;
    float x2 = drawRect.x + drawRect.width;
    float y2 = drawRect.y + drawRect.height;
    float u1 = uvRect.x;
    float v1 = uvRect.y;
    float u2 = uvRect.x + uvRect.width;
    float v2 = uvRect.y + uvRect.height;
    for (int vertex = 0; vertex < 6; vertex++) {
        int currentIndex = offset + vertex * VERTEX_COUNT;
        float x = vertex == 0 || vertex == 3 || vertex == 5 ? x1 : x2;
        float y = vertex == 0 || vertex == 3 || vertex == 1 ? y1 : y2;
        float u = x == x1 ? u1 : u2;
        float v = y == y1 ? v1 : v2;
        vertices[currentIndex] = x;
        vertices[currentIndex + 1] = y;
        vertices[currentIndex + 2] = u;
        vertices[currentIndex + 3] = v;
        vertices[currentIndex + 4] = colour.x;
        vertices[currentIndex + 5] = colour.y;
        vertices[currentIndex + 6] = colour.z;
        vertices[currentIndex + 7] = colour.w;
        vertices[currentIndex + 8] = textureIndex;
    }
}

片段着色器的行为未定义,因为:

int索引=intv_索引; ... u_纹理图[索引]。。。; u_TextureSlot是一个采样器数组,v_TexIndex是一个片段着色器输入,因此索引不是一个数组。 注意,未定义的行为意味着它可能会工作,但规范并不保证它会工作。在不同的硬件上,行为会有所不同

请参阅GLSL版本4.60最新版本,网址为: 当然,这条规则也适用于GLSL版本4.50

当聚集到着色器中的数组中时,这些类型只能使用动态统一表达式索引,否则纹理查找将导致未定义的值

我建议使用sampler2DArray,而不是sampler2D数组。 使用sampler2DArray时,根本不需要任何索引,因为索引在纹理查找时编码在纹理坐标的第三个分量中,请参见

此外,指定纹理目标并使用

GLTEX参数化GLU纹理2D,GLU纹理MIN过滤器,GLU最近; GLTEX参数化GLU纹理2D,GLU纹理MAG过滤器,GLU最近; 或纹理对象并使用

glTextureParameterim\u渲染器ID、GL\u纹理\u最小过滤器、GL\u最近; glTextureParameterim\u渲染器ID、GL\u纹理\u贴图过滤器、GL\u最近;
我编辑了这个问题以包含纹理请注意,u_TextureSlots[index]是未定义的行为。未定义的行为意味着它可能会工作,但规范不能保证它会工作。在不同的硬件上,行为会有所不同。
public Texture(String filepath) {
        IntBuffer width = BufferUtils.createIntBuffer(1);
        IntBuffer height = BufferUtils.createIntBuffer(1);
        IntBuffer channels = BufferUtils.createIntBuffer(1);

        ByteBuffer data = STBImage.stbi_load(filepath, width, height, channels, 0);
        m_Width = width.get();
        m_Height = height.get();
        m_Channels = channels.get();

        m_RendererID = glCreateTextures(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, m_RendererID);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
        glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        assert data != null : "Image " + filepath + " doesn't exist";
        STBImage.stbi_image_free(data);
    }