4

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();
}
4

2 に答える 2

5

GL バージョンを取得する唯一の「GL 承認済み」の方法は、glGetString(GL_VERSION) を使用することであり、これはドライバーによってサポートされている GL バージョンを報告します。

Mesa は、ソフトウェアまたはハードウェアで実装されている場合でも、OpenGL の任意のバージョンを実装できます。この場合、OpenGL 実装である MESA 7.7.1 によって OpenGL 1.5 が実装されています。

特定の HW が特定の GL バージョンをサポートしているかどうかを知る唯一の確実な方法は、製造元の仕様を確認することです。これは、ドライバーが古く、古い GL バージョンをサポートしている可能性があるためです。例として GeForce 8 カードがあります。当初は OpenGL 2.1 までサポートされていましたが、OpenGL 3.x が登場したときはそれもサポートされていましたが、更新されたドライバーのみを使用していました。

于 2011-04-21T11:56:54.773 に答える
1

glxinfo は、実際にハードウェア アクセラレーションがあるかどうかを示します。Ubuntu では、通常、Synaptic を介して適切な (ATI または NVIDIA) ドライバーを明示的にインストールして、ハードウェア アクセラレーションを取得する必要があります。

于 2011-04-21T08:17:01.010 に答える