【问题标题】:Sphere texture mapping (opengl and c++)球体纹理映射(opengl 和 c++)
【发布时间】:2013-05-20 19:20:08
【问题描述】:

我正在尝试向球体添加纹理,它可以工作,但我不断收到错误消息。下面是我得到的图片,

我不知道这个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* 将图像加载到图形内存内存中
  • 它在那里:surfaceImage.glTexImage2D(GL_TEXTURE_2D,0,GL_RGB);
  • 图片?那是什么物体?
  • 建议你在调试器下运行你的程序并捕获产生这个错误的函数。
  • 愚蠢的问题,但是您是否在任何时候都将矩阵推入堆栈?我看到你在哪里弹出一个,但也许我错过了你之前在哪里推过一个。

标签: c++ opengl ubuntu mapping textures


【解决方案1】:

正如glBindTexture 的文档所述,“您必须使用glGenTextures 来生成一组新的纹理名称。”。这意味着您必须首先使用有效的纹理名称填充“表面”变量。这可能是您的 GL 错误的来源。其次,在调用“glBindTexture(GL_TEXTURE_2D,0)”之前再次取消绑定纹理。第三,要自己找出导致 GL 错误的原因,最好创建一个宏来调用 glGetError 并在出现错误时打印日志消息。您可以在调用 GL 之间传播该宏,以缩小发生错误的位置。

【讨论】:

  • 我尝试将glGenTextures 添加到我的程序中,但它并没有真正起到什么作用。有或没有它都是一样的。当我添加glEnable(GL_TEXTURE_2D); 时,数字出现了;但是我仍然不确定 GL 错误是什么。我按照你的建议做了,并在整个程序中打印了 glGetError,但它到处都以0 的形式触发。我不确定这意味着什么,从我在网上看到的情况来看,它可能意味着任何事情。即使它没有错误,这显然是不正确的。你对我能做什么有任何其他建议吗?非常感谢您的帮助
  • 我对冲浪和水面感到困惑?尝试类似 glGenTextures(1, &surf); glBindTexture(GL_TEXTURE_2D, surf);
  • 它没有编译抱怨,所以我尝试这样做,但我忘记将&amp; 添加到变量中。它仍然没有摆脱那个错误。我不确定它是什么。程序显示“地球”就好了,但错误一直在后台运行。很抱歉一直用这个来打扰你。感谢您的帮助
  • 这可能发生在您代码的另一部分。据我所知,opengl 不会自行打印错误。你必须有类似 printf("GL error: %s",...);
  • glEndList(); 是此代码中的错误。现在没有它也可以工作。
【解决方案2】:

这段代码中的问题是这一行glEndList();。一旦我删除它,程序就可以正常运行。

【讨论】:

  • 我可以得到程序的编码吗?我需要尝试一些地球坐标的实验
  • 已经两年了。我知道我有密码,我只是不记得在哪里。我得去找它。你什么时候需要它?与您共享该代码没有问题。
  • 感谢您的慷慨。我需要它尽快。其实我已经有了代码,我需要的是如何操作经纬度坐标。
猜你喜欢
  • 2013-07-03
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多