【问题标题】:Displaying code-generated textures in OpenGL在 OpenGL 中显示代码生成的纹理
【发布时间】: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 中似乎已经获得的效果,但它们都或多或少地故意创建这样的效果,并不是偶然的。您确定您的实际输入数据确实包含正确的栅格化线吗?

标签: opengl rust glfw


【解决方案1】:

您的代码没有指定data_ 数组的类型。似乎 Rust 推断其类型为 32 位整数,而您告诉 OpenGL 您的数据包含 无符号字节。这种差异导致您的红色像素仅每四行出现一次。抱歉我不懂 Rust,所以不能说如何指定数组的类型。

【讨论】:

  • let mut data_: [(u32, u32, u32); 512 * 512] = [(0, 0, 0); 512 * 512];let mut data_ = [(0u32, 0u32, 0u32); 512 * 512];
  • 而且,正如 comment on the question 中所提到的,元组没有定义的布局,所以这是打破它的另一个途径。
  • @Shepmaster:不应该是(u8,u8,u8)吗?
  • 哦,我只阅读“无符号”并跳过“字节”?。是的。使用元组注释,[[u8; 3]; 512 * 512] 可能更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多