GLSLバージョン4.10を使用してテクスチャマッピングを行う方法を理解しようとしています。私はGLSLにかなり慣れていないので、シェーダーを使用してsin(time)に基づいて色がフェードする三角形のレンダリングを今日取得できてうれしかったです。今、私は単一のテクスチャでシェーダーを使用することに興味があります。
多くのチュートリアルやStackOverflowの回答でさえ、gl_MultiTexCoord0の使用を提案しています。ただし、これはGLSL 1.30以降非推奨になり、最新バージョンは4.20になりました。私のグラフィックカードは4.20をサポートしていません。そのため、4.10を使用しようとしています。
テクスチャを適切に生成してバインドしていることはわかっています。固定関数パイプラインを使用しているときにハイトマップが完全にレンダリングされ、テクスチャではなく色でうまくレンダリングされるため、適切な頂点座標とテクスチャ座標があります。
これが私のGLSLシェーダーと私のC++描画コードの一部です:
---heightmap.vert (GLSL)---
in vec3 position;
in vec2 texcoord;
out vec2 p_texcoord;
uniform mat4 projection;
uniform mat4 modelview;
void main(void)
{
gl_Position = projection * modelview * vec4(position, 1.0);
p_texcoord = texcoord;
}
---heightmap.frag (GLSL)---
in vec2 p_texcoord;
out vec4 color;
uniform sampler2D texture;
void main(void)
{
color = texture2D(texture, p_texcoord);
}
---Heightmap::Draw() (C++)---
// Bind Shader
// Bind VBO + IBO
// Enable Vertex and Texcoord client state
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
// glVertexPointer(...)
// glTexCoordPointer(...)
glUniform4fv(projLoc, projection);
glUniform4fv(modelviewLoc, modelview);
glUniform1i(textureId, 0);
// glDrawElements(...)
// glDisable/unbind everything
私も疑わしいのは、頂点シェーダーではタッチしていないので、テクスチャコーディネイトをフラグメントシェーダーに変化として渡す必要があるかどうかです。また、そこから補間されたtexcoordsをどのように取得するのかわかりません。補間された座標ではなく、0.fまたは1.fを取得するようです。シェーダーについては、それがどのように機能するかを理解するのに十分な知識がありません。誰かが私を啓発することができれば、私はわくわくするでしょう!
編集1:
@Bahbar:申し訳ありませんが、それはタイプミスでした。あるマシンでコードを入力し、別のマシンでコードを読み取っています。私が言ったように、それはすべて固定機能パイプラインで機能しました。glEnableClientStateとgl[Vertex| TexCoord] Pointerは非推奨ですが、シェーダーで動作するはずですよね?glVertexAttribPointerではなくglVertexPointerは、テクスチャではなく色で機能しました。また、glBindAttribLocation(0の位置と1のtexcoord)を使用しています。
私がまだglVertexPointerを使用している理由は、一度に1つのことを非推奨にしようとしているからです。