У меня есть простая программа, пытающаяся использовать PBO для обновления данных субтекстур, которые генерируются динамически. Проблема состоит в том, чтобы получить правильный порядок данных в текстуре, потому что они инвертированы или не сохранены в правильном порядке.
Вот код для инициализации, ввода данных и функции рисования
//////////////////////////////////////////////////////////////////////////
//Globals
#define TEX_WIDTH 512
#define TEX_HEIGHT 2048
GLuint renderedTexture;
GLuint pbo_id;
GLubyte* pbo_memory = 0;
Инициализация:
void initialize()
{
int w = 1024; //screen width
int h = 1024; //screen height
glViewport( 0, 0, w, h );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0, w, h, 0);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
//Here internal format is RGBA and input format not sure.
//Idea is to put GLushort as red channel input only.
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TEX_WIDTH , TEX_HEIGHT, 0, GL_RED, GL_UNSIGNED_SHORT, 0);
std::cout << "Error = \n" << glGetError();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glGenBuffers(1, &pbo_id);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_id);
// Is this the correct initialization of buffer size and access type???
glBufferData(GL_PIXEL_UNPACK_BUFFER, TEX_WIDTH * TEX_HEIGHT * sizeof(GLushort), 0, GL_STREAM_DRAW);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
}
а теперь нарисуйте функцию. Я хотел бы сделать вертикальные линии, но они оказываются горизонтальными, почему?
void display()
{
if(pbo_memory == 0)
{
// Get pointer to memory
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_id);
pbo_memory = reinterpret_cast<GLubyte*>(glMapBuffer(GL_PIXEL_UNPACK_BUFFER,
GL_WRITE_ONLY /*| GL_MAP_FLUSH_EXPLICIT_BIT*/));
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
}
else
{
//make lines
/*
+-------+
| | | | |
| | | | |
| | | | | 2048
| | | | |
| | | | |
| | | | |
+-------+
512
*/
for (int i = 0; i < TEX_WIDTH; ++i)
{
if( i % 64 == 0 && i > 2)
{
GLubyte* _data = &pbo_memory[i*TEX_HEIGHT*2];
GLubyte* _data_prev = &pbo_memory[(i-1) *TEX_HEIGHT*2 ];
GLubyte* _data_prev1 = &pbo_memory[(i-2) *TEX_HEIGHT*2];
GLubyte* _data_next = &pbo_memory[(i+1) *TEX_HEIGHT*2];
GLubyte* _data_next1 = &pbo_memory[(i+2) *TEX_HEIGHT*2];
for (int j = 0; j< TEX_HEIGHT*2;++j)
{
_data[j] = 255;
_data_prev[j] = 255;
_data_next[j] = 255;
_data_prev1[j] = 255;
_data_next1[j] = 255;
}
}
else
memset( &pbo_memory[i*TEX_HEIGHT*2], 0, TEX_HEIGHT * 2);
}
}
glViewport(0,0,1024,1024);
glClearColor(0,0,0.5,1);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
GLfloat m_texWidth = 256; //512/2
GLfloat m_texHeight = 1024; // 2048/2
GLfloat tw = 1.0;
GLfloat th = 1.0;
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_id);
glTexSubImage2D(GL_TEXTURE_2D,
0,
0,
0,
512,
2048 ,
GL_RED,
GL_UNSIGNED_SHORT,
0);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
assert(glGetError() == 0);glBegin(GL_QUADS);
glTexCoord2f(0.0f, th);
glVertex2f( (GLfloat)0,
(GLfloat)0 );
glTexCoord2f(tw, th);
glVertex2f( (GLfloat)m_texWidth,
(GLfloat)0 );
glTexCoord2f(tw, 0.0f);
glVertex2f( (GLfloat)m_texWidth,
(GLfloat)m_texHeight);
glTexCoord2f(0.0f, 0.0f);
glVertex2f( (GLfloat)0,
(GLfloat)m_texHeight);
glEnd();
// Swap front and back buffers
glutSwapBuffers();
}
Так почему мои вертикальные линии становятся горизонтальными, что я могу сделать, чтобы изменить их так, чтобы данные правильно загружались на графическую карту? Я использую AMD Radeon.
Задача ещё не решена.
Других решений пока нет …