使用程序生成来创建磁盘,但纹理无法正常工作
using procedural generation to creat a disk but the texture does not work properly
期望的结果是纹理在整个磁盘中几乎相同,但它似乎只能在边缘周围的几个三角形区域正确渲染
磁盘.cpp
void disk::disk(int sides)
{
float interval = ( 2 * PI )/sides;
float angle = 0.0f;
groundtexture = SOIL_load_OGL_texture
(
"gfx/ground.png",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_MIPMAPS | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
glBegin(GL_TRIANGLES);
for (int i = 0; i < sides; i++)
{
glBindTexture(GL_TEXTURE_2D,groundtexture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexCoord2f(0.5, -0.5);
glVertex3f(0, 0, 0);
glTexCoord2f(cos(angle) / 2 + 0.5, - (sin(angle) / 2 + 0.5));
glVertex3f(cos(angle), sin(angle), 0);
glTexCoord2f(cos(angle + interval) / 2 + 0.5, -(sin(angle + interval) / 2 - 0.5));
glVertex3f(cos(angle + interval), sin(angle + interval), 0);
angle += interval;
}
glVertex3f(cos(0), sin(0), 0);
glEnd();
}
磁盘可以渲染,但纹理无法正确渲染。 建议编辑,磁盘纹理不正确
无论如何,你都会得到OpenGL错误。glBindTexture
、glTexParameteri
分别不允许glTexEnvf
在glBegin
/glEnd
序列内。仅允许修改属性或指定顶点的指令。
绑定纹理并设置纹理参数后glBegin
:
glBindTexture(GL_TEXTURE_2D, myTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBegin(GL_TRIANGLES);
for (int i = 0; i < sides; i++)
{
glTexCoord2f(0.5, -0.5);
glVertex3f(0, 0, 0);
glTexCoord2f(cos(angle) / 2 + 0.5, - (sin(angle) / 2 + 0.5));
glVertex3f(cos(angle), sin(angle), 0);
glTexCoord2f(cos(angle + interval) / 2 + 0.5, -(sin(angle + interval) / 2 - 0.5));
glVertex3f(cos(angle + interval), sin(angle + interval), 0);
angle += interval;
}
glEnd();
GL_TEXTURE_MAG_FILTER不能GL_LINEAR_MIPMAP_LINEAR。它应该GL_LINEAR。所以替换这一行:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
跟
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
GL_MODULATE是一个整数值,而不是浮点值。如果要获得正确的结果,请使用正确的方法;)
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程