1

編集

わかりました、テクスチャ レンダリングにいくつかの変更を加えましたが、今は思いどおりに見えませんが、何かを変更しようとする前に、正しい道を進んでいることを確認したいだけです。私が修正しようとしている問題は次のとおりです。180000 個の頂点があります。それらのそれぞれは、190 の「クラス」のいずれかから取得できます。各クラスには、異なる時間に異なる色を割り当てることができます。だから私は190色のテクスチャを作成しようとしています.180000個の頂点のそれぞれには、対応するクラスへのtextureCoordがあります。したがって、いくつかのコードの場合:

    self.bufferTextureIndex = glGenBuffersARB(1)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, ADT.arrayByteCount(textureIndexes), ADT.voidDataPointer(textureIndexes), GL_STATIC_DRAW_ARB)               

    self.texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_1D, self.texture)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)

したがって、textureIndexes は [0..1] からの float の配列です。len(textureIndexes) は、使用している頂点の数 (180000) です。テクスチャの場合、 textureArray には、各クラスに必要な色の RBG に対応する 190 * 3 の float が含まれています。

描画部分:

    glEnableClientState(GL_TEXTURE_COORD_ARRAY)
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
    glTexCoordPointer(1, GL_FLOAT, 0, None);
    glBindTexture(GL_TEXTURE_1D, self.texture)
    glEnable(GL_TEXTURE_1D)       
    if type == GL_POINTS:
        glDrawArrays( GL_POINTS, 0, len(self.vertices) / 3 ); 
    else: 
        glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))

それで、このアプローチは正しいと思いますか?結果は私が期待しているものではありませんが、それは私が選んだ色分けのためかもしれません。ほとんどの場合、インデックスの作成が間違っていると思います。それらを構築するために、各インデックスのクラスに対応する 0 から 190 までの番号を持つファイルがあります。したがって、これまでのインデックス構築は、[0..1] の数値を取得するために、各頂点のインデックスを読み取ってからインデックス / 190 を読み取るだけでした。

EDIT2 だから私はあなたのアドバイスを受けて、私のインデックスを生成するためにインデックス + 0.5 / 190 をしました。インデックス配列の長さと値を出力しています。これは 60000 で、すべて 0 から 1 の間の数値で、ほとんどが 0.3 から 0.95 の間です。しかし、それでもすべての頂点は同じ色です。私がチェックしていない唯一のことは、1D テクスチャの生成です。多分ここで私はそれを間違えました:

    i = 0
    while i < 30:
        textureArray.append([1,0,0])
        i = i + 1
    while i < 60:
        textureArray.append([1,1,0])
        i = i + 1
    while i < 90:
        textureArray.append([1,1,1])
        i = i + 1
    while i < 120:
        textureArray.append([0,1,1])
        i = i + 1
    while i < 150:
        textureArray.append([0,0,1])
        i = i + 1
    while i < 190:
        i = i + 1 
        textureArray.append([0,0,0])

これが、テクスチャ配列を生成する方法です。これは実際の解決策ではありませんが、テスト上の理由からです。したがって、私のテクスチャは 1/6 red - 1/6 ... になるはずです。上記のテクスチャ生成:

    self.texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_1D, self.texture)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)

このテクスチャの生成は正しいですか? インデックスの範囲は前述のとおりですが、すべての頂点はテクスチャの最初の色の色を持っているためです。面白いことに、描画から glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex) を「省略」し、テクスチャ インデックスの代わりに法線を使用すると、いくつかの異なる色が得られますが、textureIndexes はすべて最初の色を指しているように見えます。私のテクスチャから。textureIndices と法線の実際の値を含む 2 つのサンプル ファイルをアップロードしました。最初のものは機能しないが、2番目のものは機能しているように見える理由はわかりません(正しい色であるかどうかを実際に確認することはできませんが、少なくともそれらは異なります)。 http://www.megafileupload.com/en/file/315895/textureIndices-txt.html http://www.megafileupload.com/en/file/315894/normalsTest-txt.html

EDIT3

だから今、私のインデックスは機能しているようです。サンプル画像は次のとおりです。

http://i.stack.imgur.com/yvlV3.png

ただし、奇妙な点は、ご覧のとおり、境界が適切に定義されていないことです。これは、テクスチャに渡すパラメータのいくつかによって何らかの影響を受ける可能性がありますか、それとも textureIndex の作成をトリプルチェックする必要がありますか?

4

1 に答える 1

1
  1. self.bufferNormalsを呼び出したときに がバインドされていたため、現時点では法線をテクスチャ座標として使用していますglTexCoordPointer。1D テクスチャは頂点カラーごとだけではありません。それらは、2D テクスチャのように、頂点ごとのテクスチャ座標によってアクセスされます。そうしないと、頂点ごとの色の代わりとして役に立たなくなります。理解できない場合は、OpenGL テクスチャリングまたはテクスチャリング全般に関する入門資料を読んでください。

  2. 上で述べたように、絶対にありません。

編集:あなたの最新の質問(スクリーンショットのあるもの)によると、単一の三角形の頂点が異なるテクスチャ座標を持つ場合(あなたの場合、それらは異なるクラスに属しますが、これは起こるべきではないと思います) 、texCoords は三角形全体で補間され、テクスチャの色を取得するために使用されます。したがって、これが発生したくない場合は、三角形のすべての頂点が同じ texCoord を持っていることを確認する必要があります (私はそう思います)。したがって、「マテリアル クラス」の境界に沿って頂点を複製する必要があります。おそらく、glShadeModel(GL_FLAT) を設定するだけで簡単で汚い解決策を得ることができますが、それは照明を平坦化し、境界三角形がどのクラスに属しているかは決定されません。

于 2011-05-31T12:53:09.987 に答える