OpenGL シェーダーの作成に興味がありますが、使用しているグラフィック カードがこれをサポートするのに十分かどうか、システムがソフトウェアの代替 (Mesa) を使用するように正しく構成されているかどうかはわかりません。自分のコンピューターが OpenGL シェーダーをサポートしているかどうかを確認するにはどうすればよいですか? (私はUbuntu 10.04を使用しています)これまでに3つのテストを試しましたが、それぞれに矛盾する答えが得られました:
1)ここにあるOpenGL A Primer 3rd Editionのサンプル コードから OpenGL シェーダー プログラムをダウンロードしてコンパイルし、正常に実行しました。ただし、他の OpenGL シェーダーを実装する同じ章の他のコード サンプルの一部は実行されません。それらのいくつかは、私のコンピューターをクラッシュさせたり、出力ウィンドウが色を点滅させたり、非常に奇妙なことをしたりすることさえあります。
2)次のコマンドを実行して取得しました:
$ glxinfo | grep "OpenGL version"
OpenGL version string: 1.5 Mesa 7.7.1
これは、私が OpenGL 1.5 を実行していることを示しているように見えますが、Mesa バージョン (私が理解しているように、これは OpenGL 2.0 のソフトウェア実装です。高速ではありませんが、ハードウェアの実際の取引と機能的に同じです) で十分なようです。 OpenGL 2.0 を実行します。コードが OpenGL 1.5 と Mesa 7.7.1 のどちらのドライブを使用しているかを確認するにはどうすればよいですか?
3) コンピューターに OpenGL のバージョンを出力するコードを書き、次の出力を得ました。
$ ./version
OpenGL Version major=1, minor=5
GLSL Version major=0, minor=0
これは Mesa について何も言っておらず、OpenGL 1.5 を実行していると思わせてしまいます。実行しているバージョンを理解するのを手伝ってください。そうすれば、シェーダーが確実に実行されるようになる前に、店に行って新しいグラフィックス カードを購入する必要があるかどうかがわかります。ありがとうございました!
PSコードは次のとおりです。
#include <GL/glut.h>
#include <stdio.h>
#include <string.h>
void getGlVersion(int *major, int *minor)
{
const char *verstr = (const char *) glGetString(GL_VERSION);
if ((verstr == NULL) || (sscanf(verstr,"%d.%d", major, minor) != 2))
{
*major = *minor = 0;
fprintf(stderr, "Invalid GL_VERSION format!!!\n");
}
}
void getGlslVersion(int *major, int *minor)
{
int gl_major, gl_minor;
getGlVersion(&gl_major, &gl_minor);
*major = *minor = 0;
if(gl_major == 1)
{
/* GL v1.x can provide GLSL v1.00 only as an extension */
const char *extstr = (const char *) glGetString(GL_EXTENSIONS);
if ((extstr != NULL) &&
(strstr(extstr, "GL_ARB_shading_language_100") != NULL))
{
*major = 1;
*minor = 0;
}
}
else if (gl_major >= 2)
{
/* GL v2.0 and greater must parse the version string */
const char *verstr =
(const char *) glGetString(GL_SHADING_LANGUAGE_VERSION);
if((verstr == NULL) ||
(sscanf(verstr, "%d.%d", major, minor) != 2))
{
*major = *minor = 0;
fprintf(stderr,
"Invalid GL_SHADING_LANGUAGE_VERSION format!!!\n");
}
}
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
int major, minor;
getGlVersion(&major, &minor);
fprintf(stderr, "OpenGL Version major=%i, minor=%i\n", major, minor);
getGlslVersion(&major, &minor);
fprintf(stderr, "GLSL Version major=%i, minor=%i\n", major, minor);
}
void init() {}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutCreateWindow("simple");
glutDisplayFunc(display);
init();
glutMainLoop();
}