2

現在、モデルを形成する 25 を超える頂点があります。最初の頂点と最後の頂点の間で色を線形に補間したい。問題は、次のコードを書くときです

glColor3f(1.0,0.0,0.0);
vertex3f(1.0,1.0,1.0);
vertex3f(0.9,1.0,1.0);
.
.`<more vertices>;
glColor3f(0.0,0.0,1.0);
vertex3f(0.0,0.0,0.0);

最後の頂点を除くすべての頂点は赤です。今、各頂点で色を手動で補間する必要なく (代わりに、opengl が自動的に行うようにネイティブに)、これらの頂点全体で色を補間する方法があるかどうか疑問に思っています。頂点。どんな助けでも大歓迎です。

ありがとうございました!

4

2 に答える 2

3

OpenGL は 1 つの頂点と次の頂点の間でピクセルの色を補間しますが、中間の頂点の値を自動的に補間する方法はわかりません。通常、これは特に難しいことではありませんが、個々の頂点ごとにコードを記述したくないので、計算を追加するのは非常に簡単です。

class pointf { 
    GLfloat x, y, z;
};

std::vector<pointf> spots;

// ...
GLfloat start_blue = 1.0f;
GLfloat end_blue = 0.0f;
GLfloat start_green = 0.0f;
GLfloat end_green = 0.0f;
GLfloat start_red = 0.0f;
GLfloat end_red = 1.0f;

GLfloat size = spots.size();

glBegin(GL_POLYGON);
for (int i=0; i<spots.size(); i++) {
    GLfloat red = start_red + (end_red-start_red) * i/size;
    GLfloat green = start_green + (end_green-start_green) * i/size;
    GLfloat blue = start_blue + (end_blue-start_blue) * i/size;

    glColor3f(red, green, blue);
    glVertex3f(spots[i].x, spots[i].y, spots[i].z);
}
glEnd();

ただし、これは頂点ごとに純粋に線形補間を行います。たとえば、ある頂点と次の頂点の間の距離を考慮しようとしません。このようなことを行う方法に関する質問は、OpenGL が単独でこれを試みない理由 (少なくともその一部) であると思います。

編集:半球全体のグラデーションの場合、次のようにします:

// Blue light on the left  
GLfloat blue[] = {0.0f, 0.0f, 1.0f, 1.0f};
GLfloat blue_pos[] = {-1.0f, 0.0f, -0.3f, 0.0f};

// red light on the right
GLfloat red[] = {1.0f, 0.0f, 0.0f, 1.0f};
GLfloat red_pos[] = {1.0f, 0.0f, -0.3f, 0.0f};

// turn on lighting:
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);

// Set up the two lights:
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, blue);
glLightfv(GL_LIGHT0, GL_POSITION, blue_pos);

glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, red);
glLightfv(GL_LIGHT1, GL_POSITION, red_pos);

// set up the material for our sphere (light neutral gray):
GLfloat sph_mat[] = {0.8f, 0.8f, 0.8f, 1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sph_mat);

// Draw a sphere:
GLUquadric *q = gluNewQuadric();
gluQuadricOrientation(q, GLU_OUTSIDE);
gluQuadricDrawStyle(q, GLU_FILL);
gluQuadricNormals(q, GLU_SMOOTH);
gluSphere(q, 1.0, 64, 64);

今のところ、球の外側を作成しましたが、半球を作成してもそれほど違いはありません。

于 2010-04-16T20:34:15.207 に答える
1

OpenGL は、ポリゴン内では色を補間しますが、ポリゴン間では補間しません。

于 2010-04-16T20:39:52.303 に答える