LINUX.ORG.RU

Сообщения Nerevarino

 

Проблема с Clickable text в Emacs

Форум — Development

Задача такая: есть буфер FirstBuffer, в котором содержится код на elisp. Этот код после вычисления должен создать буфер TextButtonBuffer, в котором должна создаться текстовая кнопка «Кнопка».Эта кнопка при клике должна возвращать нас обратно в FirstBuffer. Ну то есть я пытаюсь понять простейшую реализацию Clickable Text.

Вот мой код:

  (let ((MyMap (make-sparse-keymap)) StartPos EndPos FirstBuffer TextButtonBuffer ClickFunc)
    (progn
      (setq FirstBuffer (current-buffer))

      (defun ClickFunc()
        "Кликальщик"
        (switch-to-buffer FirstBuffer)
      )

      (switch-to-buffer "*TextButton*")
        (setq TextButtonBuffer (current-buffer))
        (setq StartPos (point))
        (princ "Кнопка" TextButtonBuffer)
        (setq EndPos (point))

      (define-key MyMap [mouse-1] 'ClickFunc)
      (add-text-properties StartPos EndPos '(mouse-face highlight keymap MyMap) TextButtonBuffer)
    )
  )   

Я совсем не уверен насчет строки

(define-key MyMap [mouse-1] 'ClickFunc)

В целом этот код не работает. Кнопка подсвечивается как кликуемая, но сам клик не пашет(

Также меня интересует реализация той же задачи на widget link. Не совсем понимаю смысл follow-link в виджетах. И как в виджете привязывать кликанье к действию?

 , ,

Nerevarino
()

Небольшой вопрос про память

Форум — Development

Всем привет. Есть вопрос касательно допустимых выделений памяти с помощью операции new.

Провел небольшой тэст:

До открытия окна создал следующий массив

int* LargeMassive; LargeMassive=new int[262144000000]; LargeMassive[262143999999]=115;

Программа запустилась и окно открылось безо всяких ошибок. Однако при этом утилита системный монитор показывает, что занимаемая приложением память не получила заметных увеличений, а то и вовсе никаких (или там только статически выделенная память отображается?).Раздел подкачки тоже без изменений. При этом std::cout << LargeMassive[262143999999];Честно выдает 115. Предыдущий элемент дает 0.

Но как так? Если я посчитал правильно, такой массив должен забрать 976 GB (sic!) из кучи.

А вот если я допишу еще нолик к размеру массива, наконец вижу ошибку bad_alloc. Но все равно, как операционка заставляет существовать тот массив?

 

Nerevarino
()

Драйвера и утилиты на материнские платы

Форум — Linux-hardware

Привет всем. Вопрос насчет драйверов и утилит для материнок в Linux. В Windows, например, если скачал специальный драйвер/утилиту для материнки с официального сайта производителя, то можно получить целый пакет плюшек-настроек. Попробовать где-то что-то разонать, поставить например дополнительные вентиляторы в корпус и скорость их вращения можно будет регулировать и т.д. и т.п.

Но я не вижу никаких драйверов/утилит для подобных вещей под Линукс на сайте производителя. Нагуглил, что вроде Intel активно сотрудничает с разработчиками ядра Linux, тем не менее в их разделе ПО тоже не увидел специальных дров/утилит.

Вопрос такой: в настоящее время подобные плюшки и правда возможны только на винде, а в Linux-е можно только довольствоваться только «просто работой железа, без особых настроек - свистелок и перделок». Зачем? Как минимум интересно, а также интересует возможность использования nVidia SLI или Ati CrossFire на Linux.

 ,

Nerevarino
()

Современный «конвеер» вывода текста и растеризация шрифтов

Форум — Development

Привет всем. Хотелось бы получить общее понимание того, как выводится текст на экран в современных ОС. Речь пойдет о векторных шрифтах, например TrueType формата ttf.

Судя по тому, что я нагуглил, в операционке хранятся ttf файлы в соответствующей папке fonts. В этих файлах хранятся для каждого символа текстовой кодировки математическое описание кривых, из которых состоит символ. Как я понял, приложения, в которых где-то выводится текст, обязаны использовать библиотеку растеризации шрифтов (например FreeType). То есть библиотеке по идее должен отдаваться код символа и ttf файл выбранного на текущий момент шрифта, чтобы она нашла в этом файле по коду математическое описание графики символа и тогда уже отрисовала. Поправьте если что не так.

Главный вопрос: растеризация происходит на CPU или GPU? В том и другом случае как вычисленный растр будет добираться до нужной позиции в окне приложения на экране?(связано ли как-то дело с контекстом для OpenGL)

 , , ,

Nerevarino
()

Исходный код стандартной библиотеки языка C

Форум — Development

Добрый день всем. Хотелось бы узнать, где можно найти исходный код стандартной библиотеки языка C. В основном хочу понять, как работают тригонометрические функции и функция извлечения квадратного корня. Какие из операций более требовательны к ресурсам, какие - нет. Используют ли они какие-то таблицы готовых значений или как-то на лету вычисляют.

 ,

Nerevarino
()

Проблема с функцией textureProj при использовании Shadow Map

Форум — Development

Добрый день. Отрабатываю освещение с тенями, получаемыми от карты теней (когда карта создается с помощью буфера глубины, получаемого при отрисовке сцены с позиции источника света).

Вот настройка сэмплера текстуры:

glGenSamplers(1,&ShadowMapSamplerId);
glBindSampler(ShadowMapSamplerUnit,ShadowMapSamplerId);

glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,GL_COMPARE_REF_TO_TEXTURE);
glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);

glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Два варианта кода фрагментного(пиксельного) шейдера:

1) Рекомендуемый OpenGL RedBook, с использованием функции textureProj (вроде как более эффективный с точки зрения использования аппаратных возможностей видеокарты)

#version 430 core
uniform sampler2DShadow ShadowMap;

vec4 clAmbient=vec4(0.2,0.2,0.2,1.0);
vec4 clSurface=vec4(0.0,0.0,1.0,1.0);

in vec3 clShadedFace;
in vec4 ShadowMapCoord;

vec4 clSaturation=vec4(1.0);
vec4 clResult;

void main(void)
{
  clResult=clSurface*(clAmbient+textureProj(ShadowMap,ShadowMapCoord)*vec4(clShadedFace,1.0));
  clResult=min(clResult,clSaturation);
  gl_FragColor = clResult;
}

В документации сказано, что при вызове textureProj для Sampler2DShadow будет возвращено либо 1.0 (если пиксель не скрыт от света) либо 0.0 если таки скрыт. На практике изображение получается таки с нужными тенями, НО освещенные части освещены очень-очень слабо, как если бы textureProj возвращала значения В ДИАПАЗОНЕ от 0 до 1, а не только краевые значения.

2)Слегка отличающийся код, призванный заменить использование textureProj на texture и ручную проверку принадлежности пикселя освещенной области

#version 430 core

uniform sampler2DShadow ShadowMap;

vec4 clAmbient=vec4(0.2,0.2,0.2,1.0);
vec4 clSurface=vec4(0.0,0.0,1.0,1.0);

in vec3 clShadedFace;
in vec4 ShadowMapCoord;

vec4 clSaturation=vec4(1.0);
vec4 clResult;

float visibility=1.0;


void main(void) 
{
  if(texture(ShadowMap,ShadowMapCoord.xyz)  < ShadowMapCoord.z)
    visibility=0.0;

  clResult=clSurface*(clAmbient+visibility*vec4(clShadedFace,1.0));
  clResult=min(clResult,clSaturation);
  gl_FragColor = clResult;
}

Вот этот вариант работает как надо: нужные тени и то , что освещено - освещено с нужной силой. Но как заставить работать первый вариант? Вроде как первый вариант чуть более быстродействен и эффективен, так как сравнение z координаты текущего пикселя и пикселя карты теней происходит на текстурном процессоре, а не в общем коде шейдера (ну или что-то в этом духе).

 ,

Nerevarino
()

Техника отрисовки полигональных моделей. (Mesh - ей)

Форум — Development

Доброе утро/день/вечер/ночь всем.Возник вопрос, как бы наиболее эффективно отрисовать 3d объект за один вызов функции OpenGL.

Вот, к примеру, возьмем формат описания 3d модели obj (от компании Wavefront). Там о каждом геометрическом объекте выписана следующая информация: 1)вершины 2)координаты текстур 3)нормали

4)каждый полигон представлен набором индексов каждого из массивов.

Вот запись простейшего куба:

# Blender v2.74 (sub 0) OBJ File: ''
# www.blender.org
mtllib Cube.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
usemtl Material
s 1
f 1//1 2//1 3//1 4//1
f 5//2 8//2 7//2 6//2
f 1//3 5//3 6//3 2//3
f 2//4 6//4 7//4 3//4
f 3//5 7//5 8//5 4//5
f 5//6 1//6 4//6 8//6

v-вершины, vn - нормали, vt - координаты текстур (этот кубик без текстур).

Запись f 1//1 2//1 3//1 4//1 обозначает полигон с индексами вершин 1,2,3,4 и индексами нормалей 1,1,1,1 для каждой вершины. Индексы координат текстур пропущены.

Суть проблемы в том, что в этом формате, каждая грань лаконично описана индексами ДЛЯ КАЖДОГО из аттрибутов вершин, в OpenGL же массив индексов для функции glDrawElements описывает ТОЛЬКО индексы вершин.И даже если засунуть все аттрибуты вершин к ним в массив, то нормаль и координата текстур будет выбираться с тем же индексом, что и сама вершина, а не с тем, с каким нужно.

Вот пример:

GLfloat VertexAttribs[]=
{
  //Координаты вершин
    -0.5f,-0.5f,0.0f,
    0.5f,-0.5f,0.0f,
    0.5f,0.5f,0.0f,
    -0.5f,0.5f,0.0f,
  //Координаты вершин

  //Нормали
    0.0 -1.0 0.0
    0.0 1.0 0.0
    1.0 0.0 0.0
    -0.0 -0.0 1.0
    -1.0 -0.0 -0.0
    0.0 0.0 -1.0
  //Нормали
}

GLushort Indices[]=
{
  0,1,2,3
}

При вызове:

     glDrawElements(GL_TRIANGLE_FAN,4,GL_UNSIGNED_SHORT,NULL);
(Индексы были забиты в GL_ELEMENT_ARRAY_BUFFER)

При таком вызове будет нарисован следующий полигон:

  f 1//1 2//2 3//3 4//4     //(в формате obj индексы начинаются с 1)

, а нужно вот такой:

  f 1//6 2//6 3//6 4//6 

Но как такое сделать? В OpenGL индексуются сразу все аттрибуты.

Хочется делать все прямо, как в формате, чтобы никаких продублированных координат вершин и текстур (ну разве что индексы для нормалей будут дублироваться).Чтобы 1 вершину использовать в двух полигонах,а не две вершины с одинаковыми координатами для каждого полигона.Для этого нужно использовать индексированную отрисовку, но там встает проблема, описанная выше. Может я чего-то не знаю, может есть какой-то красивый способ обойти проблему?

 ,

Nerevarino
()

Текстуры в OpenGL 4

Форум — Development

Проблема с наложением текстуры в OpenGL 4. Рисуется простой прямоугольник. Хочу наложить на него простейшую 2x2 текстуру (первый тексель-красный цвет, второй - зеленый, третий - синий, четевертый - желтый). То есть по логике в мой прямоугольник должны вписаться 4 разноцветных прямоугольника (красный, зеленый, синий, желтый). В итоге на выходе получаю прямоугольник, залитый одним цветом (темно-желтым). Причем этот итоговый цвет судя по всему является смешением цветов текселей (пробовал менять тексели 2x2 текстуры). То есть вместо того, чтобы накладывать на пиксели прямоугольника пиксели текстуры(тексели), OpenGL смешивает все тексели текстуры, получает 1 итоговый цвет и полностью им заливает прямоугольник. Как так? P.S. API еще только изучаю по OpenGL Red book 8th edition.

Вот фрагмент исходников:


			static GLuint TexCoordAttribLoc=glGetAttribLocation(SHAP,"inTextura_coord");
			static GLuint TextureId;
			static GLuint SamplerId;

			static const GLfloat TexCoord[]=
			{
				0.0f,0.0f,	1.0f,0.0f,
				1.0f,1.0f,	0.0f,1.0f
			};

			static const GLfloat Texels[16]=
			{
				1.0f,0.0f,0.0f,1.0f,	0.0f,1.0f,0.0f,1.0f,
				0.0f,0.0f,1.0f,1.0f,	1.0f,1.0f,0.0f,1.0f
			};

                        glActiveTexture(GL_TEXTURE0);

			glGenTextures(1,&TextureId);
			glGenSamplers(1,&SamplerId);
			glBindSampler(0, SamplerId);

                        glBindTexture(GL_TEXTURE_2D, TextureId);

			glTexStorage2D(GL_TEXTURE_2D,1,GL_RGBA32F, 2,2);

			glTexSubImage2D(GL_TEXTURE_2D,0,0,0,2,2,GL_RGBA,GL_FLOAT,Texels);

			glVertexAttribPointer(TexCoordAttribLoc,2,GL_FLOAT,GL_FALSE,0,TexCoord);
			glEnableVertexAttribArray(TexCoordAttribLoc);

Код вершинного шейдера

#version 430 core 
layout (location = 0) in vec4 vPosition;
layout(location=1) uniform mat4 CurrentMdMatrix=mat4(1.0f); 
layout(location=5) uniform mat4 CurrentPrMatrix=mat4(1.0f);
layout(location=9) in vec4 vColor;

layout(location=15) in vec2 inTextura_coord;
out vec2 textura_coord;

out vec4 FragmentColor;
void main()
{
  textura_coord=inTextura_coord;
  FragmentColor=vColor;
  gl_Position=CurrentPrMatrix*CurrentMdMatrix*vPosition;
} 

на переменные vColor и FragmentColor не обращайте внимание,я просто их не стал удалять с предыдущей версии шейдера.

Фрагментный (пиксельный) шейдер:

#version 430 core
uniform sampler2D textura;
in vec2 textura_coord;
in vec4 FragmentColor;
out vec4 fColor;
void main()
{
  gl_FragColor=texture(textura,textura_coord);
} 

 

Nerevarino
()

Оптимизация в C++

Форум — Development

Привет всем.Есть выражения: 1)a=b+c+d+e+f+g; 2)a=b*c*d*e*f*g; 2)a=(b+c)/(b-c)

Предлагаю для оптимизации заменить на:

1)a=b;a+=c;a+=d;a+=e;a+=f;a+=g; 2)a=b;a*=c;a*=d;a*=e;a*=f;a*=g; 3)int BpC=b;int BmC=b;BpC+=c;BmC-=c;BpC/=BmC;a=BpC;

Есть ли в этом смыл? Или лучше никогда на подобном не париться и давать оптимизационные параметры компилятору?

 ,

Nerevarino
()

OpenGL ES

Форум — Development

Изучаю opengl es. Проблема такая: практически сразу после инициализации opengl вызываю glEnableClientState(GL_VERTEX_ARRAY), чтобы потом задать массив вершин и таки что-то изобразить на экране.Однако glGetError выдает GL_INVALID_OPERATION.Соответственно ни массив не могу передать, ни нарисовать что-то.На десктопе и обычном OpenGL все работает нормально, согласно спецификации OpenGL ES 1.1 функция glEnableClientState вроде не была подвержена никаким «кастрациям».Ничего не понимаю....

P.S. Андроидовский планшет. OpenGL ES тестирую ,используя CrystaxNDK и библиотеку SDL2.Проект вроде как использует и OpenGL ES 1 и OpenGL ES 2.0

 ,

Nerevarino
()

Алгоритм выделения точки

Форум — Development

Всем привет!Перейду сразу к делу.

Использую последний Qt.В приложении есть область для рисования/операций над вершинами и ребрами. Рисование осуществляется при помощи OpenGL в виджете, который наследует QOpenGLWidget и QOpenGLFunctions. То есть имеется динамический массив вершин, которые потом будут отрисоваваться как GL_POINTS. Ну и динамический массив индексов массива вершин (для отрисовки ребер как GL_LINES в функции glDrawElements)

Размер области рисования может меняться. Матрица проекций генерируется функцией glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0). То есть левый нижний угол всегда имеет координату (0.0,0.0), а правый верхний (1.0,1.0)

Помимо добавления вершин, их нужно еще выделять для разных преобразований над ними (двигать, соединить пару ребром и т.д.)

Вот у меня вопрос как раз относительно алгоритма выделения - хочется чтобы он был наиболее оптимальным по быстродействию.

Что приходит на ум: вершины,как мне кажется, стоить хранить в хэш-таблице (В Qt для этого QHash есть). Но есть 2 для меня проблемы:

1)Что именно сделать ключом вершины? Простое произведение x-координаты на y-координату не даст инъективного отображения.

Думаю проинвертировать биты x-координаты и полученное число умножить на y-координату и результат сделать ключом (можно инвертировать и y, без разницы, главное что-то одно). Однако беда в том, что точки на прямой x=y все еще будут иметь один и тот же ключ. Есть у кого предложения, по какому алгоритму считать ключ?

2)Когда я буду тыкать в область виджета, я 99,9% не попаду точно в точку, которая была ранее нарисована, а где-то рядом. То есть преобразовать координаты тыкнутого места в ключ и по нему смотреть вершину в хэш-таблице не получится..... то есть при тыкании нужно получать что-то вроде диапазона ключей, размер которого зависит радиуса выделения (тыкнутая точка - центр окружности) и потом ,oh my god!, проверять, если что-то из диапазона ключей в хэш-таблице, и не просто есть ли, а самое ближайшее к ключу тыкнутой точки. Сомневаюсь я, что это будет быстро. Однако всякие Blender-, 3dMax-ы, Maya : тыкнешь в окне проекций - и вершина тут же выделена, и она будет выделена также быстро в том числе и в окне перспективы - а там и вовсе работа с трехмерным.

Вот какой алгоритм? Может я что упускаю/туплю/не знаю? Наверняка у всего этого должно быть какое-то изящное решение.

 , , ,

Nerevarino
()

Просмотр устройств компьютера

Форум — Admin

Доброго времени суток.

Система Linux Mint 17.Графическая среда - KDE.

Вопрос: 1)Есть ли в KDE утилита по просмотру всех работающих устройств компьютера (что-то наподобие диспетчера устройств в винде)? 2)Если такой утилиты нет, то как можно посмотреть информацию о железе системы (банально хоть название ЦПУ узнать).Вроде что-то подобное должно быть в папке /dev ? Или ошибаюсь?

 , ,

Nerevarino
()

Массив неопределенной емкости

Форум — Development

Не подскажите общую идею, как реализуются подобные классы http://developer.android.com/reference/java/util/Vector.html , необязательно конкретно этот и конкретно из Android SDK.Меня интересует общая идея/принцип построения массивов неопределенной длинны.В классе, как по ссылке, нет жестких ограничений на количество элементов...то есть по идее можно добавлять элементы, даже когда память уже подкачку будет использовать.Мне это непонятно, ведь на самом низком уровне ты таки должен указать емкость массива как при статическом выделении памяти (int massiv[capacity]), так и при динамическом (int☆ p= new int [capacity]). Более того, эти классы еще ухитряются вставлять элементы не только в конец массива, но и внутрь, неужели при вставке элемента, там влоб сдвигаются все впереди идущие от места вставки элементы?

 ,

Nerevarino
()

OpenGL в QT

Форум — Development

Доброго времени суток!Поставил последний QT с официального сайта. Создал простейший проект-шаблон (просто создается окошко и все), при компиляции написал мне cannot find -lGL. OpenGL библиотека у меня хранится /usr/lib/fglrx/libGL.so (драйвер ATI). Сначала вытащил символическую ссылку на библиотеку в папку /usr/lib.Не помогло. Тогда переустановил библиотеку mesa. Теперь у меня есть альтернативная libGL.so в папке usr/lib/i386-linux-gnu/mesa. И вот только теперь простейшая программа QT скомпилировалась и запустилась.

Вопрос: QT работает только с mesa-реализацией OpenGL? Но она же вроде дает только софтверный рендеринг, а не аппаратный, не? Когда я буду писать реальное OpenGL приложение на QT, оно будет в реале на mesa работать или на библиотеке от драйверов ATI? Можно ли как-то принудительно приучить приложение к работе именно на библиотеке от драйвера видеокарты?

P.S. Дистрибутив Linux Mint 17

 , , ,

Nerevarino
()

Настройка Java в Kubuntu.

Форум — Admin

1)Я начинающий пользователь Linux-а (вообще в целом после 5 минут нуб) 2)Дистрибутив Kubuntu 14.04 LTE

Как настроить проприетарную Java от oracle в системе?По умолчанию стоит Open JDK.И все java - программы по умолчанию используют ее.Ее же настройки я вижу в меню KDE.Решил поставить проприетарную Java от Oracle (зачем и почему это другой вопрос, спрашиваю не об этом).Ставлю ее как в инструкции на сайте Oracle(просто распаковать архив в удобную папку) в папку /home/MyUserName/....../JavaSExxx например. Но как все Java-программы заставить по умолчанию использовать именно ее?Да и настройки ее бы неплохо было вынести в меню KDE.

 , ,

Nerevarino
()

RSS подписка на новые темы