Программа OpenGL работает на AMD, но не на NVIDIA

0

И ошибка: "Доступ для чтения нарушения прав доступа в nvoglv64.dll"
Изображение 174551
Изображение 174551
Программа работала по назначению на моем старом AMD Radeon HD 6970. Несколько дней назад я купил GTX 970. Отличная карта, но я бы хотел, чтобы моя программа работала. Я хочу отобразить квадрат на экране для отложенного рендеринга. Я пытаюсь использовать OpenGL 4.4

Источник:

Подготовка квадранта:

modelMatrix = mat4(1.0);

vertices.push_back(vec3(-1.0f, -1.0f, 0.0f));
vertices.push_back(vec3(1.0f, -1.0f, 0.0f));
vertices.push_back(vec3(1.0f, 1.0f, 0.0f));

vertices.push_back(vec3(-1.0f, -1.0f, 0.0f));
vertices.push_back(vec3(1.0f, 1.0f, 0.0f));
vertices.push_back(vec3(-1.0f, 1.0f, 0.0f));

normals.push_back(vec3(0.0f, 0.0f, 1.0f));
normals.push_back(vec3(0.0f, 0.0f, 1.0f));
normals.push_back(vec3(0.0f, 0.0f, 1.0f));

normals.push_back(vec3(0.0f, 0.0f, 1.0f));
normals.push_back(vec3(0.0f, 0.0f, 1.0f));
normals.push_back(vec3(0.0f, 0.0f, 1.0f));

indices.push_back(0);
indices.push_back(1);
indices.push_back(2);

indices.push_back(0);
indices.push_back(2);
indices.push_back(3);

uvs.push_back(vec2(0.0f, 0.0f));
uvs.push_back(vec2(1.0f, 0.0f));
uvs.push_back(vec2(1.0f, 1.0f));

uvs.push_back(vec2(0.0f, 0.0f));
uvs.push_back(vec2(1.0f, 1.0f));
uvs.push_back(vec2(0.0f, 1.0f));

indexCount = static_cast<int>(indices.size());
is2D = true;

unsigned int handle[2];
glGenBuffers(2, handle);

glBindBuffer(GL_ARRAY_BUFFER, handle[0]);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, handle[1]);
glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec3), &uvs[0], GL_STATIC_DRAW);

glGenVertexArrays(1, &array2D);
glBindVertexArray(array2D);

glBindBuffer(GL_ARRAY_BUFFER, handle[0]);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)));
glEnableVertexAttribArray(0);  // Vertex position

glBindBuffer(GL_ARRAY_BUFFER, handle[1]);
glVertexAttribPointer((GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)));
glEnableVertexAttribArray(1);  // Texture coordinates

glBindVertexArray(0);



Отображение квадранта:

// The following three lines are called in the render loop (as 2nd pass).
// I skip rendering meshes in the first pass to better understand this error.
//sp->useSubRoutine(srp2); // SP is the shader program
//sp->resetMatrices(); // Set matrices to mat4(1.0);
//dq->render(); // DQ is the display quad


glBindFramebuffer(GL_FRAMEBUFFER, fbo); // fbo is 0 for quad
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);

if (shader != nullptr)
{
    shader->use();
    shader->setModelMatrix(modelMatrix);
}

if (is2D)
{
    glBindVertexArray(array2D);
    glDrawArrays(GL_TRIANGLES, 0, indexCount); // ERROR HERE
    return;
}



Vertex Shader:

#version 440

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec2 vertexUV;
layout(location = 2) in vec3 vertexNormal;

centroid out vec2 UV;
out vec4 position;
out vec3 normal;

uniform mat4 uniMatModel;
uniform mat4 uniMatView;
uniform mat4 uniMatProjection;
uniform mat4 uniMatModelView;
uniform mat4 uniMatModelViewProjection;
uniform mat3 uniMatNormal;




void main()
{
    UV = vertexUV;
    position = uniMatModelView * vec4(vertexPosition, 1.0);
    normal = normalize(uniMatNormal * vertexNormal);
    gl_Position = uniMatModelViewProjection * vec4(vertexPosition, 1.0);
}



Фрагментный шейдер:

#version 440

struct lightInfo {
    vec4 position;
    vec3 intensity;
    bool isActive;
};


// IN
centroid in vec2 UV;
in vec4 position;
in vec3 normal;


// OUT
layout (location = 0) out vec4 fragColor;
layout (location = 1) out vec3 positionData;
layout (location = 2) out vec3 normalData;
layout (location = 3) out vec3 colorData;


// SUBROUTINES
subroutine void renderPassType();
subroutine uniform renderPassType renderPass;


// UNIFORMS
uniform sampler2D uniSamTexture;
uniform sampler2D uniSamAlpha;
uniform sampler2D uniSamAmbient;
uniform sampler2D uniSamSpecular;
uniform sampler2D uniSamShininess;

uniform lightInfo uniPointLights[32];
uniform vec3 uniVec3AmbientEmissiveness;

layout(binding=0) uniform sampler2D positionTex;
layout(binding=1) uniform sampler2D normalTex;
layout(binding=2) uniform sampler2D colorTex;

subroutine (renderPassType)
void renderWorld()
{
    if (texture2D(uniSamAlpha, UV).rgb[0] == 1.0) // Alphamaps have to be inverted
    {
        discard;
    }
    else
    {
        colorData = texture2D(uniSamTexture, UV).rgb;
    }

    positionData = vec3(position.x, position.y, position.z);
    normalData = normal;
    fragColor = vec4(colorData, 1.0);
}

subroutine (renderPassType)
void renderLight()
{
    fragColor = vec4(1.0,0.0,0.0,1.0); // For testing purposes set to red
}

void main()
{
    renderPass();
}
  • 0
    Вы нажали кнопку прерывания в сообщении об ошибке? Какая строка вызывает ошибку?
  • 0
    Да, я много построчно отлаживал и отлаживал, так как это была не единственная проблема. Строка ошибки помечена // ERROR HERE . Это в части рендеринга :)
Показать ещё 1 комментарий
Теги:
opengl
nvidia

1 ответ

1
Лучший ответ

Такие проблемы могут возникать на картах NVIDIA, когда вы пытаетесь читать из буфера вершин, в котором не хватает элементов. Например, рендеринг 9 вершин из буфера, который содержит только 6. AMD интересно не жалуется на это.

В вашем случае вы привязываете буфер вершин к атрибуту location 2, но вы активируете местоположение 1. Это:

glVertexAttribPointer((GLuint)2, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)));
glEnableVertexAttribArray(1);  // Texture coordinates

на самом деле

                              ||
                              \/ 
glVertexAttribPointer((GLuint)1, 2, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)));
glEnableVertexAttribArray(1);  // Texture coordinates

Изменение: я только что увидел другую вещь

glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec3), &uvs[0], GL_STATIC_DRAW);

uvs.size() равно 6 в вашем приложении, поэтому OpenGL попытается прочитать 6 * 3 = 18 float. Ваш uvs-массив содержит только 12 поплавков (так как вы используете vec2 здесь).

  • 0
    Просто для любопытства: какая из двух проблем вызвала исключение?
  • 0
    оооооо, я действительно не видел эту ошибку! Вот почему так важно общаться с людьми, когда у вас есть проблема ^^ Наконец, он рендерится.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню