在OpenGL中显示代码生成的纹理

问题描述 投票:4回答:1

我想在Rust中提供基于OpenGL的canvas API,所以我决定在OpenGL中提供一个矩形并更新其纹理。我创建了红线纹理,但未按预期显示。

我如何生成纹理:

let mut texture = 0;
gl::GenTextures(1, &mut texture);
gl::BindTexture(gl::TEXTURE_2D, texture); // all upcoming GL_TEXTURE_2D operations now have effect on this texture object
                                          // set the texture wrapping parameters
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_S, gl::REPEAT as i32); // set texture wrapping to gl::REPEAT (default wrapping method)
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_WRAP_T, gl::REPEAT as i32);
// set texture filtering parameters
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MIN_FILTER, gl::NEAREST as i32);
gl::TexParameteri(gl::TEXTURE_2D, gl::TEXTURE_MAG_FILTER, gl::NEAREST as i32);
// load image, create texture and generate mipmaps

let mut data_ = [(0, 0, 0); 512 * 512];
gl::TexImage2D(
    gl::TEXTURE_2D,
    0,
    gl::RGB as i32,
    512,
    512,
    0,
    gl::RGB,
    gl::UNSIGNED_BYTE,
    &data_[0] as *const _ as *const c_void,
);

for i in 0..512 {
    data_[i + 512 * i] = (255, 0, 0);
}
gl::TexSubImage2D(
    gl::TEXTURE_2D,
    0,
    0,
    0,
    512,
    512,
    gl::RGB,
    gl::UNSIGNED_BYTE,
    &data_[0] as *const _ as *const c_void,
);

我如何显示它:

// bind Texture
gl::BindTexture(gl::TEXTURE_2D, texture);

// render container
ourShader.useProgram();
gl::BindVertexArray(VAO);
gl::DrawElements(gl::TRIANGLES, 6, gl::UNSIGNED_INT, ptr::null());

顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout (location = 2) in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

void main()
{
    gl_Position = vec4(aPos, 1.0);
    ourColor = aColor;
    TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

片段着色器:

#version 330 core
out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

uniform sampler2D texture1;

void main()
{
    FragColor = texture(texture1, TexCoord);
}

我得到:

Given image

我希望像素彼此接触。窗口大小:512x512,纹理大小:512x512。另外,我尝试了线性tex过滤,但仍然相同。

opengl rust glfw
1个回答
1
投票

您的代码未指定data_数组的类型。看起来Rust推断出它的类型是32位整数,而您告诉OpenGL您的数据包含unsigned bytes。这种差异导致红色像素仅每四行出现一次。抱歉,我不知道Rust,所以不能说如何指定数组的类型。

© www.soinside.com 2019 - 2024. All rights reserved.