glTexImage2D 不起作用,但将 FragColor 设置为 vec4(1.0, 0, 0, 1.0) 会给我红色图像
glTexImage2D won't work, but setting FragColor to vec4(1.0, 0, 0, 1.0) gives me red image
我正在尝试使用OpenGL的纹理单元将图像写入屏幕。如您所见,我将 0 写入 tex Sampler2D,因为我使用的是第 0 个纹理单元。我还把顶点和纹理做成矩形。我检查了gl错误,没有。我还将 FragColor 更改为vec4(1.0, 0, 0, 1.0);
,我确实看到了一个红色图像,这意味着我的坐标很严格。
这是我的代码:
static unsigned char * d = new unsigned char[640*360*4];
const GLfloat vertices_textures[20] = {
//vertices //positions
-1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f, 1.0f, 0.0f};
if (this->firstRun)
{
int i;
for (i = 0; i < 640*360*4; ++i)
{
d[i] = 255;
}
program = std::make_unique<Program>();
Shader vertexShader(ShaderType::Vertex);
vertexShader.load_from_string(vertexShaderSource);
program->attach_shader(vertexShader);
Shader fragmentShader(ShaderType::Fragment);
fragmentShader.load_from_string(fragmentShaderSource);
program->attach_shader(fragmentShader);
program->link();
vextexInLocation = glGetAttribLocation(program->get_id(), "aPos");
textureInLocation = glGetAttribLocation(program->get_id(), "aTexCoord");
glGenVertexArrays(1, &vertexArrayObject);
glBindVertexArray(vertexArrayObject);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_textures), vertices_textures, GL_STATIC_DRAW);
glVertexAttribPointer(vextexInLocation, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void *)0);
glEnableVertexAttribArray(vextexInLocation);
glVertexAttribPointer(textureInLocation, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (void *)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(textureInLocation);
glActiveTexture(GL_TEXTURE0);
texLocation = glGetUniformLocation(program->get_id(), "tex");
program->use();
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, 640, 360, 0, GL_RED, GL_UNSIGNED_BYTE, d);
firstRun = false;
}
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUniform1i(texLocation, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glBindVertexArray(vertexArrayObject);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
这是我的着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
void main()
{
gl_Position = vec4(aPos, 1.0);
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
和
#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D tex;
void main()
{
FragColor = texture(tex, TexCoord);
}
您无法"看到"图像,因为纹理不完整。
请参阅 OpenGL 4.6 API 兼容性配置文件规范;8.17 纹理完整性;第 306 页
如果一致地定义了利用纹理进行纹理应用所需的所有纹理图像和纹理参数,则称纹理是完整的。
。除非满足以下任何条件,否则纹理是完整的:
- 缩小滤镜需要一个 mipmap(既不
NEAREST
也不LINEAR
(,并且纹理不是 mipmap 完整的。
GL_TEXTURE_MIN_FILTER
的初始值为GL_NEAREST_MIPMAP_LINEAR
。如果你不改变它,你不创建mipmap,那么纹理就不是"完整的",不会被"显示"。请参阅glTexParameter
。
将缩小筛选器设置为GL_NEAREST
或GL_LINEAR
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
或通过glGenerateMipmap(GL_TEXTURE_2D)
生成 mipmap 来解决问题。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 重新定位图像时如何前进到下一个内存块
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- glTexImage2D 不起作用,但将 FragColor 设置为 vec4(1.0, 0, 0, 1.0) 会给我红色图像
- 仅包含RGB 565中的红色成分的图像
- 在opencv 2.3中从RGB图像中分离出红色分量图像
- OpenGL将原始图像转换为红色通道