来自 C++ 无符号字节数组的 OpenGL 2DTexture
OpenGL 2DTexture from c++ unsigned byte array
我正在尝试在片段着色器中处理二维数组 - 为了了解这一点,我开始构建我的数组:
int const _s = 512;
std::array<GLubyte,_s*_s*4> hitmap;
for(unsigned j = 0; j < _s; j++) {
for(unsigned i = 0; i < _s; i+=4) {
hitmap[i+j*_s] = j%256; //R
if(j>33 && j < 45) hitmap[i+j*_s] = 0; //R
hitmap[i+j*_s+1] = i%256; //G
if(i>33 && i < 45) hitmap[i+j*_s+1] = 0; //G
hitmap[i+j*_s+2] = 0; //B
hitmap[i+j*_s+3] = 255; //A
}
}
作为第一步,只需将其作为纹理推送并显示在表面上。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _s, _s, 0, GL_RGBA, GL_UNSIGNED_BYTE, hitmap.data());
我正在绘制两个具有以下坐标的三角形以得到一个正方形:
// positions // texture coords
1.f, 1.f, 0.0f, 1.0f, 1.0f, // top right
1.f, -1.f, 0.0f, 1.0f, 0.0f, // bottom right
-1.f, -1.f, 0.0f, 0.0f, 0.0f, // bottom left
-1.f, 1.f, 0.0f, 0.0f, 1.0f // top left
而且我的片段着色器非常愚蠢:
#version 150 core
uniform sampler2D ourTexture;
out vec4 FragColor;
in vec2 TexCoord;
void main()
{
FragColor = texture(ourTexture, TexCoord);
};
(是的,我在这里使用的是相当旧的版本 :/)
我得到的结果如下:
顶部有一些奇怪的东西,纹理似乎重复(虽然不是镜像)。我真的不知道我做错了什么 - 看起来我没有提供足够的数据。
我希望得到一个 2x2 的正方形图案,因为我通过 mod 分区将 512 像素映射到 256 的范围内。
编辑:像这样:
您误解了 GL_MIRRORED_REPEAT
的概念。请参阅 OpenGL 维基 glTexParameter
GL_MIRRORED_REPEAT
causes the s coordinate to be set to the fractional part of the texture coordinate if the integer part of s is even; if the integer part of s is odd, then the s texture coordinate is set to 1−frac(s), where frac(s) represents the fractional part of s.
这意味着如果纹理坐标在[1.0, 2.0], [3.0, 4.0], ... 范围内,则纹理被镜像;如果纹理坐标在 [0.0, 1.0], [2.0, 3.0] 范围内,则不会被镜像。
由于所有纹理坐标都在 [0.0, 1.0] 范围内,因此根本没有镜像。
缩放片段着色器中的纹理坐标以查看GL_MIRRORED_REPEAT
的概念:
void main()
{
FragColor = texture(ourTexture, TexCoord * 2.0);
};
内部for
循环的条件语句也有错误。内部循环必须 运行 从 0
到 _s*4
而不是 0
到 _s
:
for(unsigned i = 0; i < _s; i+=4) {
for(unsigned i = 0; i < _s*4; i+=4) {
一行的字节大小是_s*4
而不是_s
:
int const _s = 512;
std::array<GLubyte,_s*_s*4> hitmap;
for(unsigned j = 0; j < _s; j++) {
for(unsigned i = 0; i < _s*4; i+=4) {
hitmap[i + j*_s*4] = j%256; //R
if(j>33 && j < 45) hitmap[i + j*_s*4] = 0; //R
hitmap[i + j*_s*4 + 1] = i%256; //G
if(i>33 && i < 45) hitmap[i + j*_s*4 + 1] = 0; //G
hitmap[i + j*_s*4 + 2] = 0; //B
hitmap[i + j*_s*4 + 3] = 255; //A
}
}
我正在尝试在片段着色器中处理二维数组 - 为了了解这一点,我开始构建我的数组:
int const _s = 512;
std::array<GLubyte,_s*_s*4> hitmap;
for(unsigned j = 0; j < _s; j++) {
for(unsigned i = 0; i < _s; i+=4) {
hitmap[i+j*_s] = j%256; //R
if(j>33 && j < 45) hitmap[i+j*_s] = 0; //R
hitmap[i+j*_s+1] = i%256; //G
if(i>33 && i < 45) hitmap[i+j*_s+1] = 0; //G
hitmap[i+j*_s+2] = 0; //B
hitmap[i+j*_s+3] = 255; //A
}
}
作为第一步,只需将其作为纹理推送并显示在表面上。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, _s, _s, 0, GL_RGBA, GL_UNSIGNED_BYTE, hitmap.data());
我正在绘制两个具有以下坐标的三角形以得到一个正方形:
// positions // texture coords
1.f, 1.f, 0.0f, 1.0f, 1.0f, // top right
1.f, -1.f, 0.0f, 1.0f, 0.0f, // bottom right
-1.f, -1.f, 0.0f, 0.0f, 0.0f, // bottom left
-1.f, 1.f, 0.0f, 0.0f, 1.0f // top left
而且我的片段着色器非常愚蠢:
#version 150 core
uniform sampler2D ourTexture;
out vec4 FragColor;
in vec2 TexCoord;
void main()
{
FragColor = texture(ourTexture, TexCoord);
};
(是的,我在这里使用的是相当旧的版本 :/)
我得到的结果如下:
顶部有一些奇怪的东西,纹理似乎重复(虽然不是镜像)。我真的不知道我做错了什么 - 看起来我没有提供足够的数据。 我希望得到一个 2x2 的正方形图案,因为我通过 mod 分区将 512 像素映射到 256 的范围内。
编辑:像这样:
您误解了 GL_MIRRORED_REPEAT
的概念。请参阅 OpenGL 维基 glTexParameter
GL_MIRRORED_REPEAT
causes the s coordinate to be set to the fractional part of the texture coordinate if the integer part of s is even; if the integer part of s is odd, then the s texture coordinate is set to 1−frac(s), where frac(s) represents the fractional part of s.
这意味着如果纹理坐标在[1.0, 2.0], [3.0, 4.0], ... 范围内,则纹理被镜像;如果纹理坐标在 [0.0, 1.0], [2.0, 3.0] 范围内,则不会被镜像。
由于所有纹理坐标都在 [0.0, 1.0] 范围内,因此根本没有镜像。
缩放片段着色器中的纹理坐标以查看GL_MIRRORED_REPEAT
的概念:
void main()
{
FragColor = texture(ourTexture, TexCoord * 2.0);
};
内部for
循环的条件语句也有错误。内部循环必须 运行 从 0
到 _s*4
而不是 0
到 _s
:
for(unsigned i = 0; i < _s; i+=4) {
for(unsigned i = 0; i < _s*4; i+=4) {
一行的字节大小是_s*4
而不是_s
:
int const _s = 512;
std::array<GLubyte,_s*_s*4> hitmap;
for(unsigned j = 0; j < _s; j++) {
for(unsigned i = 0; i < _s*4; i+=4) {
hitmap[i + j*_s*4] = j%256; //R
if(j>33 && j < 45) hitmap[i + j*_s*4] = 0; //R
hitmap[i + j*_s*4 + 1] = i%256; //G
if(i>33 && i < 45) hitmap[i + j*_s*4 + 1] = 0; //G
hitmap[i + j*_s*4 + 2] = 0; //B
hitmap[i + j*_s*4 + 3] = 255; //A
}
}