Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Обновление mesa  (Прочитано 7481 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Maxim098765432

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Обновление mesa
« Ответ #15 : 17 Февраля 2014, 14:11:00 »
#include <cstdio>
#include <cstring>
#include <cassert>
#include <cmath>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
using namespace std;

GLuint VBO;
GLuint gWorldLocation;

struct Vector3f
{
    float x;
    float y;
    float z;

    Vector3f()
    {
    }

    Vector3f(float _x, float _y, float _z)
    {
        x = _x;
        y = _y;
        z = _z;
    }
};

struct Matrix4f
{
    float m[4][4];
};


static const char* pVS = " \n\
#version 330 \n\
\n\
layout (location = 0) in vec3 Position; \n\
\n\
uniform mat4 gWorld; \n\
\n\
void main() \n\
{ \n\
gl_Position = gWorld * vec4(Position, 1.0); \n\
}";

static const char* pFS = " \n\
#version 330 \n\
\n\
out vec4 FragColor; \n\
\n\
void main() \n\
{ \n\
FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n\
}";

static void RenderSceneCB()
{
    glClear(GL_COLOR_BUFFER_BIT);

    static float Scale = 0.0f;

    Scale += 0.001f;

    Matrix4f World;

    World.m[0][0] = 1.0f; World.m[0][1] = 0.0f; World.m[0][2] = 0.0f; World.m[0][3] = sinf(Scale);
    World.m[1][0] = 0.0f; World.m[1][1] = 1.0f; World.m[1][2] = 0.0f; World.m[1][3] = 0.0f;
    World.m[2][0] = 0.0f; World.m[2][1] = 0.0f; World.m[2][2] = 1.0f; World.m[2][3] = 0.0f;
    World.m[3][0] = 0.0f; World.m[3][1] = 0.0f; World.m[3][2] = 0.0f; World.m[3][3] = 1.0f;

    glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &World.m[0][0]);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);

    glutSwapBuffers();
}


static void InitializeGlutCallbacks()
{
    glutDisplayFunc(RenderSceneCB);
    glutIdleFunc(RenderSceneCB);
}

static void CreateVertexBuffer()
{
    Vector3f Vertices[3];
    Vertices[0] = Vector3f(-1.0f, -1.0f, 0.0f);
    Vertices[1] = Vector3f(1.0f, -1.0f, 0.0f);
    Vertices[2] = Vector3f(0.0f, 1.0f, 0.0f);

  glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}

static void AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType)
{
    GLuint ShaderObj = glCreateShader(ShaderType);

    if (ShaderObj == 0) {
        fprintf(stderr, "Error creating shader type %d\n", ShaderType);
        exit(0);
    }

    const GLchar* p[1];
    p[0] = pShaderText;
    GLint Lengths[1];
    Lengths[0]= strlen(pShaderText);
    glShaderSource(ShaderObj, 1, p, Lengths);
    glCompileShader(ShaderObj);
    GLint success;
    glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);
    if (!success) {
        GLchar InfoLog[1024];
        glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);
        fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, InfoLog);
        exit(1);
    }

    glAttachShader(ShaderProgram, ShaderObj);
}

static void CompileShaders()
{
    GLuint ShaderProgram = glCreateProgram();

    if (ShaderProgram == 0) {
        fprintf(stderr, "Error creating shader program\n");
        exit(1);
    }

    AddShader(ShaderProgram, pVS, GL_VERTEX_SHADER);
    AddShader(ShaderProgram, pFS, GL_FRAGMENT_SHADER);

    GLint Success = 0;
    GLchar ErrorLog[1024] = { 0 };

    glLinkProgram(ShaderProgram);
    glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &Success);
if (Success == 0) {
glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);
        exit(1);
}

    glValidateProgram(ShaderProgram);
    glGetProgramiv(ShaderProgram, GL_VALIDATE_STATUS, &Success);
    if (!Success) {
        glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
        fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);
        exit(1);
    }

    glUseProgram(ShaderProgram);

    gWorldLocation = glGetUniformLocation(ShaderProgram, "gWorld");
    assert(gWorldLocation != 0xFFFFFFFF);
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(1024, 768);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Tutorial 06");

    InitializeGlutCallbacks();

    // Must be done after glut is initialized!
    GLenum res = glewInit();
    if (res != GLEW_OK) {
      fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
      return 1;
    }

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    CreateVertexBuffer();

    CompileShaders();

    glutMainLoop();

    return 0;
}

(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 17 Февраля 2014, 14:55:52 от Maxim098765432 »

Оффлайн neon1ks

  • Старожил
  • *
  • Сообщений: 1183
    • Просмотр профиля
    • Блог молодого разработчика
Re: Обновление mesa
« Ответ #16 : 17 Февраля 2014, 16:54:08 »
Maxim098765432,
Понятно - у тебя только видеокарта от intel.
Хорошо, можно еще команду с помощью которой компилируешь.

Пользователь решил продолжить мысль 17 Февраля 2014, 18:19:25:
Посмотрел у себя. Экспериментировал в Ubuntu 14.04 64bit

Предварительно установил пакеты
sudo apt-get install libegl1-mesa-dev libgl1-mesa-dev libglew-dev g++ freeglut3-dev Затем компилировал командой
g++ -Wall -o start myopengl.cpp -lGL -lGLU -lglut -lGLEW
В итоге при запуске на встроенной видеокарте Intel получил ошибку:
Error compiling shader type 35633: '0:2(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES'А вот при запуске на дискретной карте nvidia - программа запустилась)

Вывод сделаешь сам.
« Последнее редактирование: 17 Февраля 2014, 18:19:25 от neon1ks »

Оффлайн Maxim098765432

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Обновление mesa
« Ответ #17 : 17 Февраля 2014, 21:16:59 »
А вот при запуске на дискретной карте nvidia - программа запустилась)
Вывод сделаешь сам.
Да, на desktop с nvidia geforce 9600 gt, тоже всё великолепно работает. Но мне нужен именно ноутбук с видеокартой от Intel.

Оффлайн neon1ks

  • Старожил
  • *
  • Сообщений: 1183
    • Просмотр профиля
    • Блог молодого разработчика
Re: Обновление mesa
« Ответ #18 : 17 Февраля 2014, 21:50:04 »
Maxim098765432,
Тогда обновлять драйвер на карту intel при любой возможности и проверять работу - а именно наблюдать за пакетом xserver-xorg-video-intel - со временем должна появиться поддержка OpenGL 3.3
https://launchpad.net/ubuntu/+source/xserver-xorg-video-intel
https://launchpad.net/~xorg-edgers/+archive/ppa?field.series_filter=saucy

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.