球体纹理映射(OpenGL和C ++)

3
我正在尝试为一个球体添加纹理,虽然它起作用了,但我一直收到错误提示。下面是我得到的图片: enter image description here 我不知道这个“GL error: Invalid operation”错误指的是什么。我认为这与我的代码有关。我不确定我是否正确地从我的文件中读取。以下是我用来绘制这个球体的代码。
glTranslate(0.0f, 0.0f, 0.0f);
glRotate(sunRot,0.0,0.0,1.0);
drawAroundPlanetGrid(100, 1, 50, 50, 1);
glPopMatrix();`

这就是 drawAroundPlanetGrid() 的样子。

void drawAroundPlanetGrid(double radius, int overSample, int numStrips, int numQuads, float radiusRatio)
{
GLMaterial test;
GLuint surf;
GLuint* surface;
Images::RGBImage surfaceImage;

surfaceImage=Images::readImageFile("/home/rodrtu/Desktop/SolarSystem/EarthTopography.png",Vrui::openFile("/home/rodrtu/Desktop/SolarSystem/EarthTopography.png"));

glEnable(GL_TEXTURE_2D);

//glGenTextures(1, surface);

glBindTexture(GL_TEXTURE_2D, surf);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);

double b = radius * 0.9966463577;//Geoid's semi-minor axis
double e2 = 0.0067; //Geoid's squared eccentricity, derived from flattening factor

float texY1=float(0)/float(numStrips);
double lat1=(Math::Constants<double>::pi*double(0))/double(numStrips)-0.5*Math::Constants<double>::pi;
double s1=Math::sin(lat1);
double c1=Math::cos(lat1);
double chi1=Math::sqrt(1.0-e2*s1*s1);
double xy1=radius*radiusRatio/chi1*c1;
double z1=radius*(1.0-e2)/chi1*s1;

//* Draw latitude quad strips: *
for(int i=1;i<numStrips+1;++i)
    {
    float texY0=texY1;
    double s0=s1;
    double c0=c1;
    double xy0=xy1;
    double z0=z1;
    texY1=float(i)/float(numStrips);
    lat1=(Math::Constants<double>::pi*double(i))/double(numStrips)-0.5*Math::Constants<double>::pi;
    s1=Math::sin(lat1);
    c1=Math::cos(lat1);
    chi1=Math::sqrt(1.0-e2*s1*s1);
    xy1=radius/chi1*c1;
    z1=radius*(1.0-e2)/chi1*s1;

    glBegin(GL_QUAD_STRIP);
    for(int j=0;j<=numQuads;++j)
    {
    float texX=float(j)/float(numQuads)+0.5f;
    double lng=(2.0*Math::Constants<double>::pi*double(j))/double(numQuads);
    double cl=Math::cos(lng)*radiusRatio;
    double sl=Math::sin(lng)*radiusRatio;

    glTexCoord2f(texX,texY1);
    glNormal3d(c1*cl,c1*sl,s1);
    glVertex3d(xy1*cl,xy1*sl,z1);

    glTexCoord2f(texX,texY0);
    glNormal3d(c0*cl,c0*sl,s0);
    glVertex3d(xy0*cl,xy0*sl,z0);
    }
    glEnd();
    }
    glEndList();
}

如果我的代码难以理解,请谅解。请让我知道你是否发现了代码中的问题。我尝试排除这个错误,但它仍然出现。有什么想法吗?


我没有看到你调用glTexImage*将图像加载到图形内存RAM中。 - Amadeus
图片?那是什么对象? - Amadeus
这是我使用的程序Vrui的一部分,用于3D渲染。 - TRod
1
建议您在调试器下运行程序并捕获生成此错误的函数。 - Amadeus
1
有点傻的问题,但你是否在任何时候将矩阵推入堆栈?我看到你弹出了一个,但也许我错过了你在那之前推入一个的地方。 - Darius Makaitis
显示剩余2条评论
2个回答

1
作为glBindTexture的文档所述,“您必须使用glGenTextures生成一组新的纹理名称。” 这意味着您首先必须用有效的纹理名称填充“surface”变量。这可能是您GL错误的原因所在。其次,通过调用“glBindTexture(GL_TEXTURE_2D,0)”再次取消绑定纹理后再使用它。第三,在自己找出导致GL错误的原因时,创建一个调用glGetError并在有错误时打印日志消息的宏是个好主意。然后,您可以在调用GL之间传播该宏,以缩小错误发生的范围。

我尝试在我的程序中添加 glGenTextures,但它没有什么作用。无论有没有它,情况都是一样的。当我添加 glEnable(GL_TEXTURE_2D); 时图像出现了;不过我仍然不确定GL错误是什么。我按照你建议的在整个程序中打印了 glGetError,但它们都返回0。我不确定这是什么意思,从我在网上看到的内容来看,它可能意味着任何事情。甚至可能没有错误,但显然这不是真的。 您能否提供其他建议?非常感谢您的帮助。 - TRod
我对surf和surface感到困惑?尝试使用类似glGenTextures(1, &surf); glBindTexture(GL_TEXTURE_2D, surf);的语句。 - nhkode
它一直在抱怨编译错误,所以我尝试这样做,但我忘记给变量添加&。它仍然无法消除那个错误。我不太确定是什么问题。程序可以正常显示“地球”,但错误仍在后台运行。很抱歉一直打扰你。感谢你的帮助。 - TRod
这可能发生在代码的另一个部分。据我所知,OpenGL本身不会打印错误。你必须像printf("GL error: %s",...)这样做些事情。 - felknight
glEndList(); 是此代码中的错误。现在已经去掉它,代码可以正常工作。 - TRod

0
这段代码的问题在于这一行:glEndList();。一旦我将其删除,程序就可以正常运行,没有任何错误。

请问能给我程序的代码吗?我需要尝试一些地球坐标实验。 - Hendry Tanaka
已经过去两年了。我知道我有那段代码,只是不记得放在哪里了。我得去找一下。你需要什么时候用?我很乐意与你分享那段代码。 - TRod
感谢您的慷慨。我需要尽快拿到它。实际上,我已经有了代码,我需要的是如何操作纬度和经度坐标。 - Hendry Tanaka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接