2016-04-04 11 views
2

OpenGLを使用してウィンドウにテクスチャを表示しようとしています。しかし、テクスチャは、私のウィンドウの左下にのみマッピングされ、それはカットオフ! outputopenGLテクスチャマッピング - c

は、ここに私のコードです:

テクスチャ:

GLuint textureID[1]; 
GLubyte Image[1024*768*4]; 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glGenTextures(1,textureID); 
glBindTexture(GL_TEXTURE_2D, textureID[0]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, Image); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable(GL_TEXTURE_GEN_S); 
glEnable(GL_TEXTURE_GEN_T); 

クワッド:

glPushMatrix(); 
glTranslatef(0, 0.0, -1.1); 

glMaterialf(GL_FRONT, GL_SHININESS, 30.0); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureID[0]); 
glViewport(-511,-383,1025,768); 

glBegin(GL_QUADS); 
glTexCoord2d(0.0, 0.0); glVertex2f(0.0, 0.0); 
glTexCoord2d(1.0, 0.0); glVertex2f(1024.0, 0.0); 
glTexCoord2d(1.0, 1.0); glVertex2f(1024.0, 768.0); 
glTexCoord2d(0.0, 1.0); glVertex2f(0.0, 768.0); 
glEnd(); 

glDisable(GL_TEXTURE_2D); 
glPopMatrix(); 
glFlush(); 

私は私の窓の中にテクスチャをマップしようとしています。私のウィンドウとテクスチャのサイズはともに1024x768です。私は何を間違えたのですか?私がglViewportをコメントアウトすると、テクスチャは右上にマッピングされます。

+0

ビューポートの左下隅を指定する際に-veの値を指定する特別な理由はありますか?あなたはそこに0,0を与えてみませんか? – Raki

+0

0,0を付けてコメントすると私にこの[image](http://i.imgur.com/USHBwqc.png)が届きます。私はこのようなものが欲しい:[image2](http://i.imgur.com/f3DlLVO.png) – user3335341

+0

glviewportにコメントする理由は、ビューポート(およびscissorbox)がフレームバッファのサイズ(0、 0,1024,768)、コンテキストが最新のものになります。 – Andreas

答えて

0

あなたのビューポートパラメータは無効ですあなたの特定の希望のため(x、yの値は負の値)。また、ローカル座標を(少なくともコードには表示されていない)ピクセルにマップする投影/モデルビューの行列のペアを指定していない可能性がありますが、glVertexに渡す座標はピクセルのアドレス指定のように見えます。

+0

ビューポートの値が正でなければならないという制限はありますか? – BDL

+1

@BDL:わかっているわけではありません。しかし、OPが彼のテクスチャを完全に見えるようにし、左下隅に切り取らないようにするには、この特定の用途には使用される値が無効です。 – datenwolf

+0

@BDL制限はありません。標準を読んでください:https://www.opengl.org/sdk/docs/man/html/glViewport.xhtml – Andreas

1

画像が途切れる理由は、glViewportに供給される値です。この関数は、レンダリングを行う画面の領域を指定します。したがって、x値を-511に、幅を1025に設定すると、描画はピクセル-511から514まで発生します。これはまさにあなたが見るものです。

あなたが実際に望む位置に画像を取得したいのは、入力座標を適切な正規化されたデバイス座標(NDC)にマップする投影(たぶん正射投影)です。投影法を使用しない場合、OpenGLはこのNDC座標を各軸上で-1から1までの範囲で動作し、仮定したようにピクセル座標では機能しません。

関連する問題