Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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
在OpenGL中显示代码生成的纹理_Opengl_Rust_Glfw - Fatal编程技术网

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

在OpenGL中显示代码生成的纹理,opengl,rust,glfw,Opengl,Rust,Glfw,我想在Rust中提供基于OpenGL的画布API,所以我决定在OpenGL中提供一个矩形并更新其纹理。我创建了一个红线纹理,但它并没有像我预期的那样显示 如何生成纹理: 让mut纹理=0; gl::GenTextures(1和mut纹理); gl::BindTexture(gl::TEXTURE_2D,纹理);//所有即将进行的GL_TEXTURE_2D操作现在都会影响此纹理对象 //设置纹理包裹参数 gl::TexParameteri(gl::TEXTURE_2D,gl::TEXTURE_WR

我想在Rust中提供基于OpenGL的画布API,所以我决定在OpenGL中提供一个矩形并更新其纹理。我创建了一个红线纹理,但它并没有像我预期的那样显示

如何生成纹理:

让mut纹理=0;
gl::GenTextures(1和mut纹理);
gl::BindTexture(gl::TEXTURE_2D,纹理);//所有即将进行的GL_TEXTURE_2D操作现在都会影响此纹理对象
//设置纹理包裹参数
gl::TexParameteri(gl::TEXTURE_2D,gl::TEXTURE_WRAP_S,gl::重复i32);//将纹理换行设置为gl::REPEAT(默认换行方法)
gl::TexParameteri(gl::TEXTURE_2D,gl::TEXTURE_WRAP_T,gl::重复i32);
//设置纹理过滤参数
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);
//加载图像、创建纹理并生成mipmap
让mut data_U8;=[(0,0,0);512*512];
gl::Texamage2D(
gl::纹理_2D,
0,
gl::RGB as i32,
512,
512,
0,
德国劳埃德船级社:,
gl::无符号字节,
&数据[0]为*常数uu为*常数c_无效,
);
对于0..512中的i{
数据_i+512*i]=(255,0,0);
}
gl::TexSubImage2D(
gl::纹理_2D,
0,
0,
0,
512,
512,
德国劳埃德船级社:,
gl::无符号字节,
&数据[0]为*常数uu为*常数c_无效,
);
我如何显示它:

// 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());
顶点着色器:

#版本330核心
vec3 aPos中的布局(位置=0);
vec3颜色中的布局(位置=1);
vec2 aTexCoord中的布局(位置=2);
外显颜色;
out vec2 TexCoord;
void main()
{
gl_位置=vec4(aPos,1.0);
我们的颜色=颜色;
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过滤,但仍然是一样的。

您的代码没有指定
数据数组的类型。Rust似乎推断其类型为32位整数,而您告诉OpenGL您的数据包含无符号字节。这种差异导致红色像素仅每四行显示一次。很抱歉,我不知道Rust,因此无法说明如何指定数组的类型。

元组没有定义的布局,因此将指向元组的指针提供给OpenGL可能会有风险:我不确定这与您的问题有关,但可以尝试使用平面数组。嗯,我可以想象一些方法来实现OpenGL中的效果,但它们或多或少都会故意创建这样的效果,这并不是偶然的。您确定您的实际输入数据确实包含正确的光栅化行吗?
让mut data_512;:[(u32,u32,u32);512*512]=[(0,0,0);512*512]
让mut data_=[(0u32,0u32,0u32);512*512]并且,如a中所述,元组没有定义的布局,因此这是另一种打破这种局面的途径。@Shepmaster:这不应该是
(u8,u8,u8)
?哦,我只读到“unsigned”而跳过了“bytes”