opengl - 在 OpenGL 中创建纯色纹理
问题描述
我有一个关于在没有文件的情况下创建纹理的问题。我的目标是制作一个将 vec3 颜色作为输入并返回该纹理的纹理 ID 的函数。
这是我到目前为止所拥有的,但它给出了带有随机混杂颜色条纹的奇怪输出:
unsigned int colorToTexture(glm::vec3 color, const int size) {
// Create id for texture
unsigned int tex;
// generate and bind texture
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
// set texture wrap parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// set texture filter parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// set image data
unsigned char* data = new unsigned char[size * size * sizeof(unsigned char)];
for (unsigned int i = 0; i < (int)(size * size * sizeof(unsigned char)) / 3; i ++) {
data[i * 3] = (int)(color.x * 255);
data[i * 3 + 1] = (int)(color.y * 255);
data[i * 3 + 2] = (int)(color.z * 255);
}
// set texture data and generate mipmaps
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size, size, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
// free image memory
delete[] data;
return tex;
}
解决方案
您仅将 1/3 的数据上传到该纹理中,这很可能是问题所在,请尝试以下代码:
// set image data
unsigned char* data = new unsigned char[3 * size * size * sizeof(unsigned char)];
for (unsigned int i = 0; i < size * size; i++)
{
data[i * 3] = (unsigned char)(color.x * 255.0f);
data[i * 3 + 1] = (unsigned char)(color.y * 255.0f);
data[i * 3 + 2] = (unsigned char)(color.z * 255.0f);
}
此外, glTexImage2D 调用应该是这样的,因为只有 RGB 值被放入数据变量中:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size, size, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
推荐阅读
- python - 从正态分布的 n 个值的样本中生成 N 个随机数据集?(Python)
- csv - 尝试在 QGIS 中绘制 CSV 文件的轮廓
- javascript - 找到多个元素时如何过滤getByLabelText查询?
- reactjs - React TypeScript 类型提示自动完成不适用于 Visual Studio Code 中的 React.forwardRef
- c - 如何在 C 中使用 readline() 获取历史记录?
- ios - SceneKit如何缩放相机以查看给定大小和距离的整个对象
- c# - C# Forms 事件,希望按钮单击产生两个按钮
- android - 从 AIDL 迁移到 Billing v4 我需要 InAppBillingService(com.android.vending.billing)
- python - Python ValueError: max() arg 是一个空序列
- webclient - vSphere Web 客户端错误 [400] 发送身份验证请求时出错