【发布时间】:2020-07-25 00:13:23
【问题描述】:
我想在 Rust 中提供基于 OpenGL 的画布 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);
}
我得到:
我希望像素相互接触。窗口大小:512x512,纹理大小:512x512。另外,我尝试了线性 tex 过滤,但还是一样。
【问题讨论】:
-
元组没有定义的布局,因此将指向元组的指针指向 OpenGL 可能会有风险:doc.rust-lang.org/reference/type-layout.html#tuple-layout 我不确定这与您的问题有什么关系,但也许可以试试平面代替数组。
-
好吧,我可以想象一些方法来实现您在 OpenGL 中似乎已经获得的效果,但它们都或多或少地故意创建这样的效果,并不是偶然的。您确定您的实际输入数据确实包含正确的栅格化线吗?