Разница в рендеринге OpenGL между nVidia и ATIC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Разница в рендеринге OpenGL между nVidia и ATI

Сообщение Гость »


Недавно я обновил драйверы ATI (я использую HD7970) до новейшей версии, и некоторые объекты моего проекта OpenGL перестали работать. Более того, они работают на новейших драйверах nVidia (проверено на 960м). Есть ли какая-либо разница между конвейером рендеринга ATI и nVidia, о которой мне следует знать?

Дополнительная информация:
[*]Нет ошибок из glGetError(), [*]Шейдеры скомпилированы и связаны правильно. [*]Другие объекты рендеринга работают нормально, но команды заполнения и рисования VBO отличаются. Рабочий загружается из файла *.obj и рисуется с помощью glDrawArrays(). Сломанный VBO заполняется полигонизатором (вычислительным шейдером), который берет вершины из image2D, используемого для хранения и рисования с помощью glDrawElements(), [*]с помощью простейшего отладчика графического процессора я проверил, запускается ли вершинный и фрагментный шейдер.
Когда я пытаюсь рисовать треугольниками, я ничего не вижу, но когда я переключаюсь на GL_POINTS, я вижу зеленые точки (выходные данные фрагментного шейдера — это чисто зеленый канал), которые движутся так, как должны. Это может указывать на то, что вершинный шейдер запускается, поскольку происходит умножение MVP. Это планетарные объекты LOD с одним большим VBO, поэтому я использую одну функцию для привязки всех буферов, а другую — для рисования необходимых карт высот. Размер VBO – 128 МБ

Инициализация:

glGenBuffers(1, &VBO); glBindBuffer (GL_SHADER_STORAGE_BUFFER, VBO); glBufferData (GL_SHADER_STORAGE_BUFFER, размер * sizeof (vec4), NULL, GL_DYNAMIC_COPY); glGenBuffers(1, &IndexBuffer); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, IndexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize * sizeof(unsigned int), NULL, GL_DYNAMIC_DRAW); glGenBuffers(1, &Normals); glBindBuffer (GL_SHADER_STORAGE_BUFFER, Нормали); glBufferData (GL_SHADER_STORAGE_BUFFER, размер * sizeof (vec4), NULL, GL_DYNAMIC_COPY); Заполнение VBO полигонизатором (вычислительным шейдером):

#версия 430 ядра макет (std430, привязка=1) буфер ParamsBuffer { размер поплавка; индекс uint; интервал родительского индекса; uint текстурыSize; vec4 upVector; vec4 Позиция; век4 квадрант; }; макет (std430, привязка=2) буфер VertBuffer { vec4 VBO[]; }; макет (std430, привязка=3) буфер NormalsBuffer { vec4 Нормали[]; }; макет (std430, привязка = 4) буфер IndexBuffer { индекс uint[]; }; макет (std430, привязка=10) буфер DebugBuffer { отладка vec4; }; макет (rgba32f) единообразный image2D HeightMap; макет (rgba32f) униформа image2D NormalMap; макет (local_size_x = 1, local_size_y = 1, local_size_z = 1) в; недействительный основной (недействительный) { uint WGidY=(gl_WorkGroupID.y); uint WGidX=(gl_WorkGroupID.x); uint mapVBOOffset=index*textureSize*textureSize; uint indexOffset=6*index*textureSize*textureSize; VBO[WGidY*textureSize+WGidX+mapVBOOffset]=imageLoad(HeightMap, ivec2(WGidX, WGidY)); Normals[WGidY*textureSize+WGidX+mapVBOOffset]=imageLoad(NormalMap, ivec2(WGidX, WGidY)); // отладка=VBO[0]; if(WGidX==textureSize-1 || WGidY==textureSize-1) возвращаться; uint localIndex = 6*(WGidY*textureSize+WGidX)+indexOffset; Index[localIndex+0]=(WGidY+1)*textureSize+WGidX +mapVBOOffset; Index[localIndex+1]=WGidY*textureSize +WGidX+1+mapVBOOffset; Index[localIndex+2]=WGidY*textureSize +WGidX +mapVBOOffset; Index[localIndex+3]=WGidY*textureSize +WGidX+1+mapVBOOffset; Index[localIndex+4]=(WGidY+1)*textureSize+WGidX +mapVBOOffset; Index[localIndex+5]=(WGidY+1)*textureSize+WGidX+1+mapVBOOffset; } Привязка:

glUseProgram(RenderProgram); glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 4, PerFrameBuffer); glBindBufferBase (GL_SHADER_STORAGE_BUFFER, 5, ConstantBuffer); glEnableVertexAttribArray (2); glBindBuffer (GL_ARRAY_BUFFER, Нормали); glVertexAttribPointer( 2, 4, GL_FLOAT, ГЛ_ЛОЖЬ, 0, (недействительно*)0 ); glEnableVertexAttribArray (0); glBindBuffer (GL_ARRAY_BUFFER, VBO); glVertexAttribPointer( 0, 4, GL_FLOAT, ГЛ_ЛОЖЬ, 0, (недействительно*)0 ); glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, IndexBuffer); Рисование:

float cancelFactor = 0; GLint drawMode; если (режим рендеринга == 0) drawMode = GL_TRIANGLES; если (режим рендеринга == 1) { drawMode = GL_PATCHES; GLint верт = 3; glPatchParameteri (GL_PATCH_VERTICES, 3); } if (tile->quadrant_x == nullptr) { HeightMap hp = tile->quadrantX; если (CornersInFrustum(hp.Corners)) { int mapOffset = tile->quadrantX.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int); glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset); } } if (tile->quadrant_y == nullptr) { HeightMap hp = tile->quadrantY; if ( CornersInFrustum(hp.Corners)) { int mapOffset = tile->quadrantY.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int); glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset); } } if (tile->quadrant_z == nullptr) { HeightMap hp = tile->quadrantZ; если (CornersInFrustum(hp.Corners)) { int mapOffset = tile->quadrantZ.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int); glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset); } } if (tile->quadrant_w == nullptr) { HeightMap hp = tile->quadrantW; если (CornersInFrustum(hp.Corners)) { int mapOffset = tile->quadrantW.index * 6 * heightMapSize*heightMapSize * sizeof(unsigned int); glDrawElements(drawMode, 6 * heightMapSize*heightMapSize, GL_UNSIGNED_INT, (void*)mapOffset); } } Вершинный шейдер:
#version 430 //ядро макет (расположение = 0) в vec4 vertexPosition_modelspace; макет (расположение = 2) в vec4 vertexNormal_modelspace; макет (std430, привязка = 4) буфер PerFrame { mat4 ViewMatrix; vec4 Позиция Камеры; vec4 КамераФорвард; mat4 МодельМатрица; время плавания; float perFrametab[3]; }; макет (std430, привязка = 5) буфер Константа { mat4 Проекционная матрица; vec4 SeedBuffer; vec2 размер экрана; }; макет (std430, привязка=10) буфер DebugBuffer { отладка vec4; }; из vec3 Position_worldspace; из vec3 Normal_cameraspace; из vec3 EyeDirection_cameraspace; из vec3 LightDirection_cameraspace; из vec3 LightPosition_worldspace; из vec3 NormalWorldSpace; пустая функция() { gl_Position =Матрица проекции* ViewMatrix*ModelMatrix* vec4(vertexPosition_modelspace.xyz,1); плавающее значение C = 1, вблизи = 0,1, далеко = 10000000.0f; gl_Position.z = (2*log2(C*gl_Position.w + 1) / log2(C*far + 1) - 1) * gl_Position.w; Position_worldspace = (ModelMatrix*vec4(vertexPosition_modelspace.xyz,1)).xyz; Normal_cameraspace = ( ViewMatrix *(vec4(vertexNormal_modelspace.xyz,0))).xyz; vec4normalTemp=ModelMatrix*vertexNormal_modelspace; NormalWorldSpace = нормализовать (normalTemp.xyz); }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как запустить TensorFlow на графическом процессоре AMD/ATI?
    Гость » » в форуме Python
    0 Ответы
    92 Просмотры
    Последнее сообщение Гость
  • Разница в альфа-рендеринге между OpenGL и WebGL
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Кровотечение среза при рендеринге объема среза с использованием opengl
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Руководство Packt Learn OpenGL, ошибка при рендеринге треугольника. Связано с Glchar * vertexShaderSource и GLchar * фра
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Тест глубины OpenGL не работает при рендеринге ортопроекции выбранных граней сетки
    Anonymous » » в форуме C++
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»