![](/img/trans.png)
[英]OpenGL Red Book 8th - First Example gives black box (Ubuntu)
[英]Always get a blank black window without showing triangles shown in the OPENGL programming guide 8th edition
我一直在嘗試構建Opengl編程指南(第8版)中第一個示例的程序,但是我所得到的只是一個空白的黑色窗口,沒有顯示兩個三角形。 我檢查了所有匯編,似乎一切正常。 有人可以給我些幫助嗎?
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <glew.h>
#include <FreeGL\freeglut.h>
using namespace std;
GLint attribute_v=-1; // global variables
GLuint vertexbuffer;
GLuint VertexArrayID;
GLuint program;
int width=500; int height=700;
struct ShaderInfo
{
GLenum vshader;
const char* vertexfile;
GLenum fshader;
const char* fragmentfile;
};
const char* getshaderprogram(const char* filename, string& shader)
{
fstream shaderFile( filename, ios::in );
if ( shaderFile.is_open() )
{
std::stringstream buffer;
buffer << shaderFile.rdbuf();
shader = buffer.str();
buffer.clear();
}
shaderFile.close();
return shader.c_str();
}
GLuint LoadShaders(ShaderInfo shaderinfo)
{
GLuint program;
//load and compile vertex shader
GLuint vertexshader=glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentshader=glCreateShader(GL_FRAGMENT_SHADER);
string shaderprogramtext;
const char* Vertexshadersource=getshaderprogram(shaderinfo.vertexfile,shaderprogramtext);
const GLint vlength=shaderprogramtext.size();
glShaderSource(vertexshader,1,&Vertexshadersource,&vlength);
glCompileShader(vertexshader);
for(unsigned int i=0;i<shaderprogramtext.size();++i)
{
cout<<Vertexshadersource[i];
}
cout<<endl;
GLint status;
glGetShaderiv( vertexshader, GL_COMPILE_STATUS, &status );
if( status!=GL_TRUE )
{
std::cerr<<"unable to compile the vertex shader..."<<endl;
}
char* infoLog=new char[100];
GLsizei buffsize=0;
glGetShaderInfoLog(vertexshader,buffsize,NULL,infoLog);
for(int i=0;i<buffsize;++i)
{
cout<<infoLog[i];
}
cout<<endl;
delete[] infoLog;
//load and compile fragment shader
string fragmentshadertext;
const char* Fragmentshadersource=getshaderprogram(shaderinfo.fragmentfile,fragmentshadertext );
const GLint flength=fragmentshadertext.size();
for(unsigned int i=0;i<fragmentshadertext.size();++i)
{
std::cout<<Fragmentshadersource[i];
}
cout<<endl;
glShaderSource(fragmentshader,1,&Fragmentshadersource,&flength);
glCompileShader(fragmentshader);
glGetShaderiv( fragmentshader, GL_COMPILE_STATUS, &status );
if ( status != GL_TRUE )
{
cerr << "\nFragment Shader compilation failed..." << '\n';
}
infoLog = new char[];
buffsize = 0;
glGetShaderInfoLog( fragmentshader, buffsize, NULL, infoLog );
for ( int i = 0; i < buffsize; ++i )
{
cout << infoLog[ i ] << endl;
}
delete [] infoLog;
// create the shader program
program = glCreateProgram();
// attach the vertex and fragment shaders to the program
glAttachShader( program, vertexshader );
glAttachShader( program, fragmentshader );
// link the objects for an executable program
glLinkProgram( program );
GLint compiled;
glGetProgramiv( program, GL_LINK_STATUS, &compiled );
if ( !compiled )
{
cout << "Link failed..." << endl;
}
cout<<"Program:"<<program<<endl;
// return the program
return program;
}
void init(void)
{
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
GLdouble vertices[6][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 },
{ -0.90, 0.85 },
{ 0.90, -0.85 }, // Triangle 2
{ 0.90, 0.90 },
{ -0.85, 0.90 }
};
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
ShaderInfo shaders = { GL_VERTEX_SHADER, "vertex_shader.txt" , GL_FRAGMENT_SHADER, "fragment_shader.txt" };
program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(attribute_v, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attribute_v);
const GLchar* attribute_name = "attribute_v"; // this name has to be the same variable name in the vertex_shader file.
attribute_v = glGetAttribLocation(program, attribute_name); // check attribute activated.
if (attribute_v == -1)
{
cout<<"could not bind attribute for vertex..."<<endl;
}
}
void display(void)
{
//glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VertexArrayID);
glDrawArrays(GL_TRIANGLES, 0, 6);
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutInitContextVersion(4,2);
glutInitContextProfile(GLUT_CORE_PROFILE);
glutCreateWindow("Triangle Visualization");
glewExperimental = GL_TRUE;
if (glewInit())
{
cerr << "Unable to initialize GLEW ... exiting" << endl;
exit(EXIT_FAILURE);
}
cout << "The version of opengl is : "<<glGetString(GL_VERSION)<<endl;
init();
glutDisplayFunc(display);
glutMainLoop();
}
此處的語句順序錯誤:
glVertexAttribPointer(attribute_v, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attribute_v);
const GLchar* attribute_name = "attribute_v";
attribute_v = glGetAttribLocation(program, attribute_name);
您正在使用attribute_v
然后為其分配值。 由於將其初始化為-1,因此glVertexAttribPointer()
和glEnableVertexAttribArray()
將導致GL_INVALID_VALUE
錯誤。
const GLchar* attribute_name = "attribute_v";
attribute_v = glGetAttribLocation(program, attribute_name);
glVertexAttribPointer(attribute_v, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(attribute_v);
如果OpenGL渲染有任何問題,最好調用glGetError()
來檢查是否觸發了任何錯誤情況。
這很可能是視頻卡驅動程序問題。 不知道您的環境是什么,但這對我有用。
環境:Dell Inspiron 15 7559,Nvidia GeForce GTX 960M,Ubuntu 15.10
安裝順序很重要,特別是最后安裝視頻卡包。 請注意,您要先將操作系統更新到最新版本。 另外,如果您的操作系統是32位的,則在所有軟件包名稱的末尾附加“:386i”。 如果不存在32位版本,則apt-get會讓您知道。 但是,如果使用OpenGL 4.x,大多數人都在運行64位Linux。
關於顯卡驅動程序的一個說明,apt儲存庫可能無法為您提供最新的驅動程序,對於我來說,“ nvidia-current”軟件包就是這種情況。 我必須通過打開Ubuntu軟件和更新實用程序來找到最新的Nvidia軟件包的名稱:
這是OpenGL Redbook 8th Edition所需的軟件包,以及安裝它們的順序:
sudo apt-get install linux-headers-generic build-essential
sudo apt-get install mesa-utils
sudo apt-get install libxmu-dev libxmu-headers
sudo apt-get install freeglut3-dev
sudo apt-get install libglew1.10
sudo apt-get install libglew-dev
# Bad!
#sudo apt-get install nvidia-current
# Good :)
sudo apt-get install nvidia-352-updates
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.