因此,当涉及将ppm纹理应用到四边形时,我有一些粗糙的内容。我的问题是颜色不“正确”。Opengl在将纹理应用到对象时出现错误的颜色
下面是对木星汞几个行星。
唯一正确的颜色是地球。
我下载的纹理在线(JPEG文件),然后从Linux命令行
jpegtopnm Mercury.jpg > Mercury.ppm
我没有这一切,你在上面看到的图像的转换他们。
起初的颜色都倒,所以我改变
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ImgWidth, ImgHeight, 0, GL_RGB,
GL_UNSIGNED_BYTE, TexBits);
到
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ImgWidth, ImgHeight, 0, GL_BGR,
GL_UNSIGNED_BYTE, TexBits);
和固定的反转颜色(R,而不是b ... ECT)。现在我被困在这里了......如何纠正纹理以显示行星的正确颜色?
这里是水银纹理文件
这里是处理纹理
void read_file(const char * filename)
{
FILE *infile;
char buf[80];
char string[256];
unsigned char *texImage;
int i, temp;
GLubyte *sp;
if ((infile = fopen(filename, "rb")) == NULL)
{
printf("File open error\n");
exit(1);
}
fgets(string, 256, infile);
fgets(string, 256, infile);
while (string[0] == '#')
fgets(string, 256, infile);
sscanf(string, "%d %d", &ImgWidth, &ImgHeight);
if (TexBits != 0)
free(TexBits);
TexBits = (GLubyte *) calloc(ImgWidth * ImgHeight * 3, sizeof(GLubyte));
for (i = ImgHeight - 1; i >= 0; i--)
{
sp = TexBits + i * ImgWidth * 3;
fread (sp, sizeof(GLubyte), ImgWidth * 3, infile);
}
fclose(infile);
}
void bindTexture()
{
glGenTextures(10, texName);
glBindTexture(GL_TEXTURE_2D, texName[1]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
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);
read_file("Mercury.ppm");
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ImgWidth, ImgHeight, 0, GL_BGR,
GL_UNSIGNED_BYTE, TexBits);
///// rest of planets in order.. (same code for each of them)
}
void drawCircle(GLfloat size, GLfloat offset, GLint r)
{
quadratic=gluNewQuadric();
gluQuadricDrawStyle(quadratic, GLU_FILL);
gluQuadricTexture(quadratic, GL_TRUE);
gluSphere(quadratic, size, r, r);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
/* mercury */
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texName[1]);
glColor4f(1.0, 1.0, 1.0, 1.0);
DrawPlanet(-17.0f, -4.0f, -9.0f, zAxis, .7f, .3f, 25);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
// rest of code is similar to the one above
}
我发现它很难搞清楚为什么颜色是鲜艳的颜色的绿色,而不是代码每个星球的实际颜色..看来,该计划是棕色问题..任何想法?
你确定你的文件都是'P6',对吗?并有一个最大值(在维度线上的第三个数字)为255?我不知道'GLubyte'是什么,但我知道最大值<= 255的P6每个像素只有1个字节,所以如果'GLubyte'不是1个字节,这可能是一个问题。在任何情况下,P6中的像素顺序都是红色,绿色和蓝色。 –
这不是我的问题的解决方案,但它确实解决了我的问题。我做了一些打印语句来获取标题信息,以便为您拍摄它的屏幕截图。我遇到过我没有将255从混音中拉出来,因此它将255中的一些存储在我的字节中它搞砸了颜色..我把它拉出来,并将bgr更改为rgb,它完美的工作! – DWolf
然后我会写一个答案。 :-) –