C++ 无形地形

C++ 无形地形,c++,opengl,graphics,3d,terrain,C++,Opengl,Graphics,3d,Terrain,我正在使用GL_TRIANGLE_STRIP将地形绘制到屏幕上,但是当我编译并运行程序时,我什么也得不到。当我将GL_三角形_带更改为GL_线时,它会显示并工作。我该怎么做才能让它与GL_TRIANGLE_STRIP一起工作 void drawScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,

我正在使用GL_TRIANGLE_STRIP将地形绘制到屏幕上,但是当我编译并运行程序时,我什么也得不到。当我将GL_三角形_带更改为GL_线时,它会显示并工作。我该怎么做才能让它与GL_TRIANGLE_STRIP一起工作

void drawScene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -10.0f);
glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
glRotatef(-_angle, 0.0f, 1.0f, 0.0f);

GLfloat ambientColor[] = {.5, .5, .5, 1.0f};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor);
float scale = 5.0f / max(63.0,63.0);
glScalef(scale, scale*10, scale);
glTranslatef(-(float)(63.0) / 2, 0.0f, -(float)(63.0) / 2);
     /*GLfloat lightColor0[] = {0.6f, 0.6f, 0.6f, 1.0f};
     GLfloat lightPos0[] = {-0.5f, 4, 32, 0.0f};
     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0);
     glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);*/



glColor3f(0.3f, 0.9f, 0.0f);
for(int x = 0;x<64;x++){
    glBegin(GL_LINES);
    for(int z = 0;z<63;z++){
        glNormal3f(0,1,0);
        Vertex(x,map[x][z],z);
        Vertex(x,map[x][z+1],z+1);
    }
    glEnd();
}
for(int z = 0;z<64;z++){
    glBegin(GL_LINES);
    for(int x = 0;x<63;x++){
        Vertex(x,map[x][z],z);
        Vertex(x+1,map[x+1][z],z);
    }
    glEnd();
}
void drawsecene(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-10.0f);
glRotatef(30.0f、1.0f、0.0f、0.0f);
glRotatef(-U角,0.0f,1.0f,0.0f);
GLfloat ambientColor[]={.5,5,5,1.0f};
GLLIGHTModelf(GL_灯光_模型_环境光、环境色);
浮动刻度=5.0f/最大值(63.0,63.0);
glScalef(标度,标度*10,标度);
GLTRANSTEF(-(浮动)(63.0)/2,0.0f,-(浮动)(63.0)/2);
/*GLfloat lightColor0[]={0.6f,0.6f,0.6f,1.0f};
GLfloat lightPos0[]={-0.5f,4,32,0.0f};
glLightfv(GL_LIGHT0、GL_DIFFUSE、lightColor0);
glLightfv(GL_LIGHT0,GL_位置,lightPos0)*/
GL3F(0.3f、0.9f、0.0f);

对于(intx=0;x,可以通过谷歌搜索找到三角形带的解释。上有一个插图

我的建议是打印出顶点数据的前五个顶点,并用手在纸上绘制。GL_线工作的事实表明正确的顶点在那里,您可能只是以错误的顺序绘制它们

另一条建议是禁用


作为黑暗中的随机刺,是否启用了“剔除”(culling)?这可能是因为它没有绘制任何三角形,因为三角形的背面不可见。请尝试添加:

glDisable(GL_CULL_FACE);
为您初始化代码,或仅删除:

glEnable(GL_CULL_FACE);

从您的初始代码。

不要费心使用固定功能,它太旧了,甚至手机都不使用它。@DeadMG如果您只想在屏幕上显示一些内容,那就好了。固定功能不受欢迎的一个好处是它使OpenGL变得精简和敏捷(与其他API竞争应该是这样的),但它确实大大增加了学习曲线。当然,除非您购买超级圣经:)。@user1021915:即时模式与固定功能无关。它被弃用的时间甚至比着色器存在的时间更长。OpenGL-1.1(1996)引入了顶点阵列,从那时起,即时模式只是传统模式–使用IM的唯一有效原因是,如果您想使用显示列表,即服务器端几何体。自从引入顶点缓冲区对象(约2003年)显示列表已被弃用。请注意,第一个完全可编程的硬件大约在那时可用,与今天的GPU相比非常有限。@datenwolf与固定管道相对应的所有功能都已弃用,但在2008年的OpenGL 3.0中没有删除。GLSL是在2004年引入的。只是因为您或其他人考虑r一些不推荐的东西,直到ARB说它是不推荐的。糟糕的形式?也许。此外,固定功能与即时模式完全相关,因为它是OpenGL支持它的方法。这样,通过不推荐固定功能,ARB也不推荐即时模式,这一点您无疑会同意早就应该使用了。@user1021915:着色器可以很好地使用即时模式。即时模式和固定的函数管道之间绝对没有关系。而且ARB在很长一段时间内试图关闭即时模式。只需查找OpenGL-2的讨论,他们已经尝试删除显示列表和即时模式,但随后我不这么认为,因为它会导致太多的遗留软件损坏。到目前为止,即时模式和显示列表保留在剔除中始终是我在这些场景中关闭的第一件事。听起来你肯定是以错误的方式缠绕顶点。
glEnable(GL_CULL_FACE);