2017-04-19 11 views
2

背景

。 私はpygletでスクリーン上の各x座標とy座標のラムダ関数を実行し、そのピクセルを私が望む色で塗りつぶすことで可視化しています。手続きGLテクスチャ

これはあまり最適ではありません。

長方形のオブジェクトを作成し、その上にテクスチャをレンダリングするようにGLエンジンに指示し、GLエンジンにxとyと引き換えに色を返すラムダ関数を与える方法が存在することを疑っています座標。

擬似は

def get_color(pos): 
    x, y = pos 
    color = x * y % 255 
    return [color, color, color] 


width = 1680 
height = 1024 

win = window.Window(fullscreen=False, vsync=True, width=width, height=height) 

glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
gluOrtho2D(0, win.width, 0, win.height) 
glTextureMapper(get_color) 
win.clear() 

points = [0, 0, width, 0, width, height, 0, height] 
pyglet.graphics.draw(int(len(points)/2), GL_QUADS, ('v2f', points)) 

TLDR質問

どのように私はラムダ関数を使用してポリゴンに色かの例をpyglet?これはシェイダーですか?

Pygletの例が好ましいが、任意の言語で例ではこれはおそらく完全な答えはありませんが、少しさらにあなたを得る可能性があります

+0

OpenGLはポリゴンを使用せず、三角形(および線と点)のみを使用します。ピクセルの色は、プリミティブ(三角形、線または点)を定義する頂点間で補間されます。各ピクセルの機能が必要な場合は、シェーダを使用してください。既にピクセルごとに色を計算している場合は、おそらくテクスチャが便利です。私の最善のアドバイスは、いくつかのチュートリアルや最新のOpenGL(ver> = 3.x)についての書籍に従っています – Ripi2

答えて

1

歓迎されています。
また、奇妙なことに、私はテクスチャではあまり働かなかったことに留意してください。

あなたができることは、クワッドのセットのテクスチャグループを作成し、バッチに追加することです。なぜ私はラムダ関数が必要なのか完全にはわからないからです。

class TextureGroup(pyglet.graphics.Group): 
    def set_state(self): 
     glEnable(texture.target) 
     glBindTexture(texture.target, texture.id) 

    def unset_state(self): 
     glDisable(texture.target) 

vertice_mem = {} 

batch = pyglet.graphics.Batch() 
texture_group = TextureGroup() 
vertice_list = batch.add(2, pyglet.gl.GL_QUADS, None, ('v2f', points)) 
vertice_mem[(x,y)] = vertex_list 

これは、テクスチャは、特定の面に追加する方法を最適化し、さらに多くの、より速く、よりダイナミックなそれらをバッチレンダリングにそれらの顔を追加するための一つの方法です。

頂点を更新する必要がある場合は、いつでもvertice_list.verticesにアクセスして、その特定の面のx,yペアを変更することができます。

カスタムグループを使用すると、特定のテクスチャを「オンザフライ」で作成することができます。この場合、「プロシージャル」テクスチャを作成するために一緒にステッチする特定のテクスチャをプリレンダリングします。

@ Ripi2とは、手続き型メモリマッピングがどのように動作するのか、実際にどのように動作するのかを読む良いヒントです。サンドボックスゲームで見られるほとんどのグラフィックスは、オンデマンドグラフィックの幻想を作り出すためのテクスチャの実際的な再利用です。

最終的な最後のヒントは、シェーダを調べる必要があることです。テクスチャの乱れを操作して作成することによって、「テクスチャ」を自動的に生成するのがはるかに高速です。そうでなければ、なぜならピクセル領域を何らかの方法で反復処理する必要があるからです。

しかし、これも私の経験の域ではありません。仲間の旅行者だけが、何年もの間収集した情報です。

+0

答えをありがとう、私の質問にあまり答えていない場合でも、トピックにいくつかの良い点があります。 – firelynx

1

厳密に言えば、OpenGLは四角形(四角形)を描くことはできませんが、2つの三角形を作るために常に2つの角の間の対角線を使用できます。 (コーナー間の補間にはいくつかの違いがありますが、おそらくあなたに影響することはありません。)

ピクセルと私はペタンティックではありませんが、あなたは3D地形オブジェクトサーフェイス上の点を着色しています。 (私は、地形がどのような角度や距離から見ても同じ色を維持したいと思っています)

OK、私は本当の答えになるでしょう。手続き型地形生成のカラーリングは一度だけ行われますか、それとも動的に変化しますか?

地形を一度作成して色付けする場合は、テクスチャマップを使用します。地形のコーナーでテクスチャ座標を割り当てる方法を学ぶ必要があります(TL; DR:(0.0,0.0)、(1.0,0.0)、(1.0,1.0)、(0.0,1.0)) glTexImage2Dを使用して画像をGPUに転送する方法について説明します。

テクスチャマップは2Dラスタ画像に過ぎません。枕やPython Imaging Libraryパッケージではない場合、Pygletはこれを処理できます。

地形の色をオンザフライで変更したい場合は、地形が描画されるたびに実行されるOpenGLシェーディング言語で書かれた小さな関数であるフラグメントシェーダが必要です。また、OpenGLが動作するため、3D座標変換を処理する頂点シェーダも作成する必要があります。

これは、テクスチャマップにアプローチする考え方とコーディングが増えることを意味します。しかし、OpenGL(またはDirectX、またはRenderMan、...)のすべてがシェイダーで行われているので、学習を始めることもできます。また、シェーダでは、色だけでなく、手続き型のモデリングやアニメーションを行うことができます。たとえば、地形の高さや色を動的に生成することができます。

これが役に立ちます。

関連する問題